2

CellTree に基づく GWT アプリケーションで Generics を使用したい場合、Generics で奇妙な問題が発生します。特に、ツリー内のすべてのノードに対して、それに属するノード、つまりその子ノードを保持したいと考えています。この目的のために、汎用クラス 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 に答える