Dado el siguiente código:¿Por qué no es posible anular un tipo abstracto ya implementado?
class A {
class B
type C <: B
trait D
}
class E extends A {
type C = B
}
class F extends E {
override type C = B with D
}
¿Por qué compilador de presentación del IDE Scala dentro del IDE de Eclipse Indigo se quejan con el mensaje de error tipo C primordial en la clase E, que es igual a F.this.B; tipo C tiene tipo incompatible?
Después de todo, la clase "B" solo se "modifica" con el carácter "D" y, por lo tanto, las dos definiciones de tipo son del mismo tipo de base, que es "B". De ahí las definiciones de tipos compatibles.
El código debajo de funciona. Considero que las reglas para la asignación de tipo similar a la asignación de variables, tales como:
class Foo
trait Bar
val a: Foo = new Foo
val fooWithBar: Foo = new Foo with Bar
Tengo entendido mal?
Foo with Bar es un subtipo de Foo. Este no es el problema. No se le permite redefinir un miembro de tipo mientras está fijo, incluso a un subtipo. Si tuviera la clase Bar extiende Foo, tampoco podría redefinir un miembro de tipo de Foo a Bar. –