首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java (6.19) IVisitor参数传递

Java (6.19) IVisitor参数传递
EN

Stack Overflow用户
提问于 2015-10-27 10:41:51
回答 1查看 208关注 0票数 0

问题

我在wicket-util-6.19源代码、示例库等方面查看了教程,但是没有找到这个问题的答案。这个问题是关于我可以在IVisitor中使用什么样的参数(专门化)。

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

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

参观

我想使用一个访问者遍历树,并返回基于一个MyObjectType (枚举,但可能是一个数字或任何东西)支持节点的PropertyEn对象。

这就是我写访问的方式:

代码语言:javascript
复制
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泛型参数节点对象时存在泛型问题。

...Cannot实例化参数,因为实际参数和形式参数列表长度不同.

使它发挥作用

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

代码语言:javascript
复制
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的第一个类型参数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-27 14:32:47

我发现了问题..。它是visitChildren()方法的签名。

我用的是:

代码语言:javascript
复制
public final <R> R visitChildren(final IVisitor<Component, R> visitor) 
{ ... }

我应该用的是:

代码语言:javascript
复制
public final <S extends Component, R> R visitChildren(final Class<?> clazz, final IVisitor<S, R> visitor)
{ ... }

所以代码看起来是这样的:

代码语言:javascript
复制
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());
        }
    }
)};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33365761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档