当我想在基于 CellTree 的 GWT 应用程序中使用泛型时,我遇到了一个奇怪的问题。我特别想为树中的每个节点保存属于它的节点,即它的子节点。为此,我创建了一个通用类 NodeData。这当然使我的应用程序变得更加复杂和麻烦,但就节点而言,它已经完成了它的工作。我无法克服的一点是与每个节点对应的ListDataProviders的修改(刷新)。正如您在以下代码中看到的那样,这是泛型的问题:
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 获取的列表相同,但它无法接受它。我应该改变/做什么?
最佳答案
这很奇怪......
以下代码编译并运行没有任何问题。
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>>();
}
}
你能尝试一下吗?
您确定所有源代码都已编译吗?
也许您应该提供更多源代码。
关于java - 在 ListDataProvider 中使用通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12365151/