Scala case语句中的类型推断失败
这是我能找到的最小的一个案例Scala case语句中的类型推断失败,scala,types,compiler-errors,Scala,Types,Compiler Errors,这是我能找到的最小的一个案例 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 =
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“忘记了”当它检查case语句的返回类型时,A
应该是一个特定的类型
请注意,如果将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中测试。您的导入肯定有问题,因为您的示例可以正确编译:
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编译器没有走得太远,以至于它理解如果你通过
Actor
,A
应该始终是Act
;请参见Str
案例。它正确地推断,当您传递Str
时,aFoo[String]
,a
应该是String
。类型推断是有限的;Scala编译器没有走得太远,以至于它理解如果你通过Actor
,A
应该始终是Act
;请参见Str
案例。它正确地推断出,当您传递Str
时,aFoo[String]
,a
应该是String
。是的,类型推断在正常情况下确实可以正常工作。这个bug似乎与Act
中的been()
函数有关。我会在问题中添加更多细节。是的,类型推断在正常情况下确实很有效。这个bug似乎与Act
中的been()
函数有关。我会在这个问题上补充更多细节。