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 object

... Не удается создать экземпляр из аргументов, потому что фактические и формальные списки аргументов различаются по длине...

Чтобы это работало

Это скомпилирует и, возможно, сработает, но требует неконтролируемого приведения и отражения:

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());
        }
    }
)};
Другие вопросы по тегам