У меня есть система экземпляров объектов, которые содержат ссылку на объект определения. У меня есть класс верхнего уровня для каждого дерева наследования. Объект экземпляра имеет общую ссылку на соответствующий класс определения.
Используя универсальные методы в геттере, подкласс объекта верхнего уровня может получить определение правильного типа без преобразования типов. Однако абстрактный подкласс, который снова подклассифицируется, не может:
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
}
}
Почему getDef
требует, чтобы Bear
приводился к ( Animal
), чтобы получить a BearDef
? Медведь окончательно определяется как extends Animal расширяет BearDef>
.
Используя обобщения в геттере, подкласс объекта верхнего уровня может получить определение правильного типа без преобразования типов. Однако абстрактный подкласс, который снова подклассифицируется, не может:
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
}
}
Почему getDef
требует, чтобы Bear
приводился к ( Animal
), чтобы получить a BearDef
? Медведь окончательно определяется как extends Animal расширяет BearDef>
.
Используя обобщения в геттере, подкласс объекта верхнего уровня может получить определение правильного типа без преобразования типов. Однако абстрактный подкласс, который снова подклассифицируется, не может:
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
}
}
Почему getDef
требует, чтобы Bear
приводился к ( Animal
), чтобы получить a BearDef
? Медведь окончательно определяется как extends Animal расширяет BearDef>
.
[ Edit ] Еще более странно, что если я изменю строку класса Bear:
abstract class Bear<D extends BearDef> extends Animal<BearDef> { }
(в этом случае D не используется и не имеет значения), он все равно не работает. Сотрите D, и следующая строка устранит ошибку в приведенном выше коде (но не помогает мне делать то, что мне нужно делать с определениями подклассов):
abstract class Bear extends Animal<BearDef> { }