Java Wicket (6.19) IVisitor 参数传递

标签 java generics tree wicket visitor-pattern

问题

我一直在查看 wicket-util-6.19 源代码、示例库等的教程,但没有找到这个问题的答案。 这个问题是关于我可以在 IVisitor 中使用哪种类型的参数(特化)。

剧透:我知道如何让代码工作,我只是想知道为什么我不能按照我想要的方式去做。

我有一个NestedTree。如果您熟悉 wicket-6 NestedTree,您可能知道该树由 Node 组成,其模型是您声明树的对象。所以它由 Node 组成(树比这更复杂 - 这只是为了举例)。

访问

我想与访问者一起遍历树并返回支持 NodeMyObjectType 对象,该对象基于 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 对象

时存在泛型问题

...Cannot instantiate from arguments because actual and formal arguments lists differ in length...

让它发挥作用

这可以编译并可能工作,但需要未经检查的转换和反射:

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 的第一个类型参数?

最佳答案

我发现了问题...这是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());
        }
    }
)};

关于Java Wicket (6.19) IVisitor 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33365761/

相关文章:

java - 使用关于持久性和 XML 的 InputStream 的最佳方式

java - Spring Security @PreAuthorize 使用 SpEL 语言访问 Autowiring bean

Java 继承 : should an extension of a class inherit the class?

java - spring 如何 Autowiring 通用转换器?

C#泛型和继承问题

c++ - 叶子上有重复条目的树

java - 从叶子创建求和树

java - OOP中如何按参数顺序调用方法?

c# - 我如何告诉编译器我的泛型肯定允许 "|="或强制转换为 int?

python - 尝试在 Python 中从头开始打印目录系统树(无导入模块)