gpt4 book ai didi

Java Wicket (6.19) IVisitor 参数传递

转载 作者:行者123 更新时间:2023-12-01 22:03:06 26 4
gpt4 key购买 nike

问题

我一直在查看 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com