我遇到了案例类令人费解的类型推理问题。这是一个最小的例子:
trait T[X]
case class Thing[A, B, X](a: A, f: A => B) extends T[X]
def hmm[X](t: T[X]) = t match {
case Thing(a, f) => f("this really shouldn't typecheck")
}
Scala决定a: Any
和f: Any => Any
,但这不合适;他们确实应该有a: SomeTypeA
和f: SomeTypeA => SomeTypeB
类型,其中SomeTypeA
和SomeTypeB
是未知类型。
另一种说法是,我认为假设的Thing.unapply
方法应该类似于
def unapply[X](t: T[X]): Option[(A, A => B)] forSome { type A; type B } = {
t match {
case thing: Thing[_, _, X] => Some((thing.a, thing.f))
}
}
此版本在f("this really shouldn't typecheck")
正确地给出了类型错误。
这看起来像编译器中的错误,还是我错过了什么?
编辑:这是在Scala 2.10.3上。
答案 0 :(得分:3)