Java Wicket (6.19) Передача аргументов для посетителя
проблема
Я искал учебник из источника wicket-util-6.19, библиотеки примеров и т. Д., Но не нашел ответа на этот вопрос. Этот вопрос о том, какие параметры (специализация) я могу использовать с IVisitor.
Спойлер: Я знаю, как заставить работать код, я просто хотел бы знать, почему я не могу сделать так, как я хочу.
У меня есть NestedTree. Если вы знакомы с wicket-6 NestedTree, вы можете знать, что дерево состоит из узла, модели которого являются объектом, с которым вы объявили свое дерево. Таким образом, он состоит из Node
Посещение
Я хочу пройтись по дереву с посетителем и вернуть объект MyObjectType, поддерживающий узел, основанный на PropertyEn (перечисление, но может быть числом или чем-то еще).
Вот как бы я написал визит:
private MyObjectType findNode(final PropertyEn propertyEn) {
return myNestedTree.visitChildren(new IVisitor<Node<MyObjectType>, MyObjectType>() {
@Override
public void component(Node<MyObjectType> object, IVisit<MyObjectType> visit) {
if ( object.getModelObject().getPropertyEn == propertyEn ) {
visit.stop(object.getModelObject());
}
}
});
Существует проблема с универсальным в использовании первого универсального аргумента объекта IVisitor Node
... Не удается создать экземпляр из аргументов, потому что фактические и формальные списки аргументов различаются по длине...
Чтобы это работало
Это скомпилирует и, возможно, сработает, но требует неконтролируемого приведения и отражения:
private MyObjectType findNode(final PropertyEn propertyEn) {
return myNestedTree.visitChildren(new IVisitor<Node<MyObjectType>, MyObjectType>() {
@Override
public void component(Component object, IVisit<MyObjectType> visit) {
if ( object instanceof Node) {
if (((Node<PropertyEn>) object).getModelObject().getProto() == lxproto) {
visit.stop(((Node<PropertyEn>) object).getModelObject());
}
// A Node has no concept of nesting. The tree is made as such with other data structures.
// No need to go deeper within an Node thus.
visit.dontGoDeeper();
}
}
)};
Вопрос
Почему я не могу просто использовать специализированный тип в качестве первого аргумента типа в IVisitor?
1 ответ
Я обнаружил проблему... это подпись метода visitChildren().
Тот, который я использовал:
public final <R> R visitChildren(final IVisitor<Component, R> visitor)
{ ... }
То, что я должен использовать, это:
public final <S extends Component, R> R visitChildren(final Class<?> clazz, final IVisitor<S, R> visitor)
{ ... }
Таким образом, код будет выглядеть так:
private MyObjectType findNode(final PropertyEn propertyEn) {
return myNestedTree.visitChildren(Node.class, new IVisitor<Node<MyObjectType>, MyObjectType>() {
@Override
public void component(Node<MyObjectType> object, IVisit<MyObjectType> visit) {
if ( object.getModelObject().getPropertyEn() == propertyEn ) {
visit.stop(object.getModelObject());
}
}
)};