问题
我在wicket-util-6.19源代码、示例库等方面查看了教程,但是没有找到这个问题的答案。这个问题是关于我可以在IVisitor中使用什么样的参数(专门化)。
:我知道如何让代码工作,我只是想知道为什么我不能按照我想要的方式去做。
我有一个NestedTree。如果您熟悉wicket-6 NestedTree,您可能知道该树是由节点组成的,其模型是您用其声明树的对象。因此,它是由节点组成的(树比节点更复杂--这只是为了举例说明)。
参观
我想使用一个访问者遍历树,并返回基于一个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泛型参数节点对象时存在泛型问题。
...Cannot实例化参数,因为实际参数和形式参数列表长度不同.
使它发挥作用
这将编译并可能工作,但需要未经检查的转换和反射:
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的第一个类型参数?
发布于 2015-10-27 14:32:47
我发现了问题..。它是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());
}
}
)};https://stackoverflow.com/questions/33365761
复制相似问题