Tengo un sistema de instancias de objeto que contiene una referencia a un objeto de definición. Tengo una clase de nivel superior para cada árbol de herencia. El objeto instancia tiene una referencia genérica a la clase de definición correspondiente.¿Por qué este genérico no reconoce su límite de superclase (Java)?
Utilizando genéricos en el getter, una subclase del objeto de nivel superior puede obtener el tipo correcto de definición sin conversión. Sin embargo, una subclase abstracta que es nuevo no puede subclases:
class Def { }
abstract class Animal<D extends Def> {
D def;
D getDef() { return def; }
}
class CatDef extends Def { }
class Cat extends Animal<CatDef> { }
abstract class BearDef extends Def { }
abstract class Bear<D extends BearDef> extends Animal<D> { }
class BlackBearDef extends BearDef { }
class BlackBear extends Bear<BlackBearDef> { }
class AnimalDefTest {
public static void main (String... args) {
Cat cat = new Cat();
CatDef catDef = cat.getDef(); // CatDef works fine
Bear bear = new BlackBear();
BearDef bearDef = bear.getDef(); // Error: Expected Def not BearDef? Why???
BearDef bearDef2 = ((Animal<BearDef>)bear).getDef(); // Works
}
}
¿Por qué getDef
requieren un Bear
convertirse a (Animal<BearDef>
) para obtener una BearDef
? Bear se define definitivamente como extends Animal<? extends BearDef>
.
[Editar ] Aún más extraño, si cambio de la línea de la clase del oso:
abstract class Bear<D extends BearDef> extends Animal<BearDef> { }
(En cuyo caso no se utiliza y D es irrelevante) que todavía no funciona. Borrar D y la siguiente línea resuelve el error en el código anterior (pero no me ayuda a hacer lo que tengo que ver con las definiciones de las subclases):
abstract class Bear extends Animal<BearDef> { }
+1: se me adelantó. – Powerlord
+1 de mí también. –
Ese * tipo de * tiene sentido, pero como sabe que es * al menos * un BearDef, ¿no debería asumir esencialmente lo que tienes en la segunda línea? – Nicole