У меня проблема с шаблоном посетителя и дженериками. У меня есть некоторый абстрактный класс, чьи дети должны быть посещены. Посмотрите на этот код:
public abstract class Element extends SomeSuperClass {
public void accept(Visitor<? extends Element> v) {
v.visit(this);
}
}
public interface Visitor<T extends SomeSuperClass> {
void visit(T element);
}
Итак, идея такова: у меня есть некоторая иерархия классов (например, Element
является подклассом SomeSuperClass
). У меня есть общий Visitor
интерфейс для посещения этой иерархии. Теперь в середине этой иерархии находится класс Element
, который является абстрактным и имеет свои собственные подклассы.
Теперь я хочу, чтобы Element
принимал всех посетителей своих подклассов, поэтому я поставил эту строку:
public void accept(Visitor<? extends Element> v)
Но теперь я получаю сообщение об ошибке:
Метод visit (
capture#1-of ? extends Element
) в типеVisitor<capture#1-of ? extends Element>
неприменим для аргументов (Element
).
Я понимаю, что ? extends Element
не Element
. У меня вопрос: могу ли я выразить свою мысль по-другому? Или я просто пропустил идею дженериков в этом случае?