scala - Scala 类型推断和隐式转换
问题描述
以下代码有效:
scala> import scala.language.implicitConversions
import scala.language.implicitConversions
scala> implicit val longToInt = (l: Long) => l.toInt
longToInt: Long => Int = $$Lambda$1821/0x000000010086e840@52bd9a27
scala> def printInt(n: Int) = println(n)
printInt: (n: Int)Unit
scala> val opt: Option[Long] = None
opt: Option[Long] = None
scala> val n = opt.getOrElse(0L)
n: Long = 0
scala> printInt(n)
0
getOrElse
但是,如果我们将表达式嵌套在函数调用中,编译器会抛出类型不匹配错误:
scala> printInt(opt.getOrElse(0L))
<console>:16: error: type mismatch;
found : AnyVal
required: Int
printInt(opt.getOrElse(0L))
^
为什么opt.getOrElse(0L)
有类型 AnyVal?
斯卡拉 2.12.8
解决方案
当你写
printInt(opt.getOrElse(0L))
opt.getOrElse(0L)
使用预期类型键入Int
。Option#getOrElse
的签名是
getOrElse[B >: A](default: ⇒ B): B
因为它是通用的,所以编译器会尝试找到B
具有opt.getOrElse[B](0L)
type 的类型Int
。所以B
必须满足约束B >: Long
(因为A
在上面的签名中是Long
)和B <: Int
(来自返回类型)。显然没有这样的B
。Scala规范说这一定是一个错误,但没有说是哪个,而这里编译器在猜测后恰好报告了它B = AnyVal
。
另一种解决方法是为 指定预期类型opt.getOrElse(0L)
:
printInt(opt.getOrElse(0L): Long)
或类型参数:
printInt(opt.getOrElse[Long](0L))
推荐阅读
- oracle - 如何将 CASE 语句与字符串一起使用?
- python - python 3中非ASCII字符的编码/解码问题
- generics - 带有闭包的通用 func 通过 Observable
- java - 如何使用 RestTemplate 与 POJO 一起进行 Put rest 调用
- testng - TestNG - 可以在测试执行报告中忽略数据提供者测试方法吗?
- php - 当我将所有图像都设置为 col-6 时,为什么我的图像会位于彼此下方?
- angular - NgRx 存储与选择器调用两次
- java - 在 Java 中执行 while(rs.next) 时跳过结果集的第一行
- mysql - Mysql2::Error: 指定的键太长;对于只有 87 db 字段的表,最大密钥长度为 767 字节
- openshift - 重命名 okd 集群的主节点的最佳方法是什么?