类型检查我有简单的类型层次斯卡拉:误区与斯卡拉
trait A {
trait A1
}
object B extends A {
case object B1 extends A1
}
object C extends A {
case object C1 extends A1
}
而且,我会使用这些类型这样的:
def get(): Any = C.C1
get() match {
case _: B.A1 => println("B")
case _: C.A1 => println("C")
case _: A#A1 => println("Any")
}
出人意料的是,我越来越B
印刷(我期望C
)。
为什么编译器将C.C1
作为B.A1
的实例?
我想这是类型擦除的问题,尝试'scalac -Xprint:erasure',你的模式匹配被编译成'A.A1' –
@佐尔坦HTTP://www.scala- lang.org/files/archive/spec/2.11/03-types.html#equivalence –
@HerringtonDarkholme我不认为这些是[复合类型](http://www.scala-lang.org/old/node/ 110),但[路径依赖类型](http://stackoverflow.com/questions/5581836/why-does-scala-have-path-dependent-types)。无论如何,我的假设是错误的。 –