Excel - Затенение всей строки на основе изменения значения

У меня есть система экземпляров объектов, которые содержат ссылку на объект определения. У меня есть класс верхнего уровня для каждого дерева наследования. Объект экземпляра имеет общую ссылку на соответствующий класс определения.

Используя универсальные методы в геттере, подкласс объекта верхнего уровня может получить определение правильного типа без преобразования типов. Однако абстрактный подкласс, который снова подклассифицируется, не может:

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 .

Используя обобщения в геттере, подкласс объекта верхнего уровня может получить определение правильного типа без преобразования типов. Однако абстрактный подкласс, который снова подклассифицируется, не может:

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 .

Используя обобщения в геттере, подкласс объекта верхнего уровня может получить определение правильного типа без преобразования типов. Однако абстрактный подкласс, который снова подклассифицируется, не может:

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> .

? расширяет BearDef> .

[ Edit ] Еще более странно, что если я изменю строку класса Bear:

abstract class Bear<D extends BearDef> extends Animal<BearDef> { }

(в этом случае D не используется и не имеет значения), он все равно не работает. Сотрите D, и следующая строка устранит ошибку в приведенном выше коде (но не помогает мне делать то, что мне нужно делать с определениями подклассов):

abstract class Bear extends Animal<BearDef> { }
7
задан Carl Manaster 10 November 2010 в 18:16
поделиться