ho gerarchia tipo semplice a Scala:malinteso con controlli di tipo a Scala
trait A {
trait A1
}
object B extends A {
case object B1 extends A1
}
object C extends A {
case object C1 extends A1
}
E, Userò questi tipi del genere:
def get(): Any = C.C1
get() match {
case _: B.A1 => println("B")
case _: C.A1 => println("C")
case _: A#A1 => println("Any")
}
Sorprendentemente, mi sto B
stampato (mi aspettavo C
).
Perché il compilatore considera C.C1
come istanza di B.A1
?
Credo che questo è un problema di tipo cancellazione, provare 'scalac -Xprint: erasure', il vostro pattern match ottenere compilato per' A.A1' –
@ Zoltán http: //www.scala- lang.org/files/archive/spec/2.11/03-types.html#equivalence –
@HerringtonDarkholme Non penso che questi siano [tipi composti] (http://www.scala-lang.org/old/node/ 110), ma [tipi dipendenti dal percorso] (http://stackoverflow.com/questions/5581836/why-does-scala-have-path-dependent-types). In ogni caso, la mia ipotesi è sbagliata. –