Dadas las siguientes características y clase. ¿Por qué esta compilación? ¿Se puede usar esto realmente para algo?Clases concretas con miembros de tipo abstracto
trait Container {
type A
}
trait AnotherContainer[B]{
def x(b : B) : B
}
trait Mixed extends Container with AnotherContainer[Container#A]
class Impl extends Mixed{
def x(a : Container#A) = a
}
new Impl().x _
scala> new Impl().x _
res0: (Container#A) => Container#A = <function>
Actualización:
class Baz { type T; }
es en realidad una característica, pero no pude encontrar la motivación para ello: #1753.
Parece un error para mí. –
¿Por qué? B en el caso de AnotherContainer en Mixed es A, por lo que la firma de x es consistente entre AnotherContainer.x e Impl.x. ¿O me estoy perdiendo algo? –
@Randall Bueno, el 'tipo A' es abstracto, y no veo que se concrete en ninguna parte. Así que esperaría que 'Impl' no compilara, devolviendo un error de" necesita ser abstracto ". –