2

当我想在基于 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 获得的列表相同,但它不能接受它。我应该改变/做什么?

4

1 回答 1

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

    }
}

你能试试吗?

你确定所有的源代码都编译了吗?

可能你应该提供更多的源代码。

于 2012-09-11T12:16:43.953 回答