如果您在Eclipse中输入以下代码并悬停f2
以显示方法签名,那就错了。仅当方法返回Future Either时才会发生这种情况。
鉴于此代码:
object HelloScala extends App{
def f1 = Future { 1 }
def f2 = {
val future = f1
future.map {
case i: Int => Right(1)
case _ => Left(0)
}
}
Thread.sleep(10000)
}
而不是Future[Either[Int,Int]]
,我看到这个:
任何想法,如果这是可以解决的?
Eclipse显示的类型(这是Scala编译器推断的类型)没有错,它是编译器可以找到的最准确的类型。为什么?
所有编译器都知道这个Future
将持有Left[Int]
或Right[Int]
;这两种类型都扩展了这3个特征:
Either[Int, Int]
如预期的那样Product
因为Left
和Right
都是案例类,所有案例类都延伸Product
;和Serializable
出于同样的原因(所有案例类别都是Serializable
)所以推断类型是这三者的组合。
您可以通过在调用map
时自己明确指定所需类型来轻松修复它:
def f2 = {
val future = f1
future.map[Either[Int, Int]] {
case i: Int => Right(1)
case _ => Left(0)
}
}