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
时,a
Foo[String]
a
应该是
String
。类型推断是有限的;Scala编译器没有走得太远,以至于它理解如果你通过
Actor
A
应该始终是
Act
;请参见
Str
案例。它正确地推断出,当您传递
Str
时,a
Foo[String]
a
应该是
String
。是的,类型推断在正常情况下确实可以正常工作。这个bug似乎与
Act
中的
been()
函数有关。我会在问题中添加更多细节。是的,类型推断在正常情况下确实很有效。这个bug似乎与
Act
中的
been()
函数有关。我会在这个问题上补充更多细节。