Scala模式匹配推断`Any`而不是存在类型,打破类型安全?

时间:2013-12-03 19:16:18

标签: scala types

我遇到了案例类令人费解的类型推理问题。这是一个最小的例子:

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: Anyf: Any => Any,但这不合适;他们确实应该有a: SomeTypeAf: SomeTypeA => SomeTypeB类型,其中SomeTypeASomeTypeB是未知类型。

另一种说法是,我认为假设的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上。

1 个答案:

答案 0 :(得分:3)

Mark Harrah在Freenode的#scala频道中指出了这一点:是的,这是一个错误。

https://issues.scala-lang.org/browse/SI-6680