Свойство внутреннего класса, имеющее общий тип внешнего класса - PullRequest
1 голос
/ 04 апреля 2019

У меня есть класс Item , который будет использоваться в качестве универсального типа в следующем классе:

abstract class AbstractClass<I extends Item, V extends AbstractClass.Inner> {
    abstract class Inner {
        I item;
    }
}

Затем я подкласс AbstractClass , также его Внутренний с Страница расширение Элемент , упомянутый выше:

class ImpClass extends AbstractClass<Page, ImpClass.Inner> {
    class Inner extends AbstractClass.Inner {
        void method(){
             // Setup item
             // Printout class of item, which is Page
             item.callMethodOfPage(); // won't compile without conversion to Page
        }
    }
}

Теоретически, элемент в ImpClass.Inner должно быть Page и имеет метод только в Page .Это потому, что я что-то упускаю?

1 Ответ

2 голосов
/ 04 апреля 2019

AbstractClass.Inner является необработанным типом. Вам необходимо параметризовать AbstractClass:

abstract class AbstractClass<I extends Item, V extends AbstractClass<I, V>.Inner> {
    abstract class Inner {
        I item;
    }
}

class ImpClass extends AbstractClass<Page, ImpClass.Inner> {
    abstract class Inner extends AbstractClass<Page, Inner>.Inner {
        void method(){
             // Setup item
             // Printout class of item, which is Page
             item.callMethodOfPage(); // compiles
        }
    }
}
...