類型檢查我有簡單的類型層次斯卡拉:誤區與斯卡拉
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)。無論如何,我的假設是錯誤的。 –