当我想在基于CellTree的GWT应用程序中使用Generics时,我遇到了一个奇怪的问题。我特别想要为树中的每个节点保存属于它的节点,即其子节点。为此,我创建了一个泛型类NodeData。这当然使我的应用程序更加复杂和繁琐,但就节点而言,它已经完成了它的工作。我无法克服的是ListDataProviders的修改(刷新),它对应于每个Node。您可以在以下代码中看到泛型问题:
static class NodeData<T extends BaseProxy> {
NodeData(T data) {
this.data = data;
}
public T data;
public ListDataProvider<? extends NodeData<? extends BaseProxy>> children;
}
在项目的后期,我尝试了代码行:
NodeData<?> data = (NodeData<?>) value;
List<NodeData<? extends BaseProxy>> newData = new ArrayList<NodeData<? extends BaseProxy>>(data.children.getList());
newData.add(new NodeData<BaseProxy>(customer));
data.children.setList(newData);
虽然我没有收到编译错误,但是我收到关于最后一行的运行时错误,这对我来说似乎很奇怪,因为编译器没有检测到它:
The method setList(List<capture#9-of ? extends CustomTreeModel.NodeData<? extends BaseProxy>>) in the type ListDataProvider<capture#9-of ? extends CustomTreeModel.NodeData<? extends BaseProxy>> is not applicable for the arguments (List<CustomTreeModel.NodeData<? extends BaseProxy>>)
它与ListDataProvider获得的List相同,但它无法接受。我应该改变/做什么?
答案 0 :(得分:2)
这很奇怪......
以下代码编译并运行没有任何问题。
public class CustomTreeModel {
public static void main(final String[] args) {
final BaseProxy customer = new Customer();
final Object value = new NodeData<BaseProxy>(new Customer());
final NodeData<?> data = (NodeData<?>) value;
final List<NodeData<? extends BaseProxy>> newData = new ArrayList<NodeData<? extends BaseProxy>>(
data.children.getList());
newData.add(new NodeData<BaseProxy>(customer));
data.children.setList(newData);
}
private static class Customer implements BaseProxy {
}
public static class NodeData<T extends BaseProxy> {
NodeData(final T data) {
this.data = data;
}
public T data;
public ListDataProvider<? extends NodeData<? extends BaseProxy>> children = new ListDataProvider<NodeData<? extends BaseProxy>>();
}
}
你能尝试吗?
您确定所有源代码都已编译好吗?
可能是您应该提供更多源代码。