在ListDataProvider中使用通用List

时间:2012-09-11 07:53:35

标签: java gwt generics

当我想在基于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相同,但它无法接受。我应该改变/做什么?

1 个答案:

答案 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>>();

    }
}

你能尝试吗?

您确定所有源代码都已编译好吗?

可能是您应该提供更多源代码。