使用Either的Eclipse方法签名

问题描述 投票:0回答:1

如果您在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]],我看到这个:

enter image description here

任何想法,如果这是可以解决的?

scala
1个回答
1
投票

Eclipse显示的类型(这是Scala编译器推断的类型)没有错,它是编译器可以找到的最准确的类型。为什么?

所有编译器都知道这个Future将持有Left[Int]Right[Int];这两种类型都扩展了这3个特征:

  • Either[Int, Int]如预期的那样
  • Product因为LeftRight都是案例类,所有案例类都延伸Product;和
  • Serializable出于同样的原因(所有案例类别都是Serializable

所以推断类型是这三者的组合。

您可以通过在调用map时自己明确指定所需类型来轻松修复它:

def f2 = {
  val future = f1
  future.map[Either[Int, Int]] {
    case i: Int => Right(1)
    case _ => Left(0)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.