据我所知,这是最小的案例。
import akka.actor.ActorDSL.Act
trait Foo[A]
object Foo {
case class Str(str: String) extends Foo[String]
case object Actor extends Foo[Act]
def foo[A](f: Foo[A]): A = f match {
case Str(string) => string
case Actor => new Act {
become { case e => println(e) }
}
}
}
通过此错误
Foo.scala:12: type mismatch;
[error] found : akka.actor.ActorDSL.Act
[error] required: A
[error] case Actor => new Act {
[error] ^
Str
大小写只是用来说明类型推断在正常用例中有效,但是Scala某种程度上“忘记”了A
在检查case语句的返回类型时应该是特定类型。请注意,如果将
new Act
中的部分函数提取为单独的函数,它将再次正确编译。import akka.actor.ActorDSL.Act
trait Foo[A]
object Foo {
case class Str(str: String) extends Foo[String]
case object Actor extends Foo[Act]
val partial: PartialFunction[Any, Unit] = {
case e => println(e)
}
def foo[A](f: Foo[A]): A = f match {
case Str(string) => string
case Actor => new Act {
become(partial)
}
}
}
这是编译器错误吗?
最佳答案
您的导入必须有问题,因为否则示例将正确编译:
trait Foo[A]
trait Act
object Foo {
case class Str(str: String) extends Foo[String]
case object Actor extends Foo[Act]
def foo[A](f: Foo[A]): A = f match {
case Str(string) => string
case Actor => new Act {}
}
}
在Scala 2.11.7中测试。
关于scala - case语句中的类型推断失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35649550/