0

同じタイプであると予想されるノードの特定のサブクラスの50の異なるタイプのリストがあると想像してください。そうでない場合は、ClassExceptionが発生します。このリストを受け取るメソッドと、特定のタイプを保持および実行するノードがあります

私はこのようなことをしたいと思います:

public <E extends Node> receive(List<Node> list, Node<E extends Node> node){
    for (Node element : list ){
         node.addElement((E) element); //Type erasure, if you put wrong node no CastException in Runtime 
    }
}

ただし、これは避けてください。

public <E extends Node> receive(List<Node> list, Node<E extends Node> node){
    for (Node element : list ){
         if      (element instanceof SubNode1) node.addElement((Subnode1) element); 
         else if (element instanceof SubNode2) node.addElement((Subnode2) element);
         //(...)
         else if (element instanceof SubNode50) node.addElement((Subnode50) element);
    }
}

ジェネリックにキャストできない場合は、次のようなことを行うとよいでしょう。

public <E extends Node> receive(List<Node> list, Node<E extends Node> node){
    for (Node element : list ){
         node.addElement(element.autoDowncastToSubClassOf("Node"));
    }
}

このオプションはすべてnode.addElement(E node)を考慮しているので、Eを期待しています。あらゆる種類のノードを受け入れてキャストするためにこれを変更することを考えました。しかし、それは次のように起こります。なぜList <type>は、コンパイル時と実行時に非型要素を吸収するのでしょうか。

この2番目のアプローチを破棄する必要がありますか?

4

2 に答える 2

1

特定のクラスのノードが常に独自のクラスのノードを要素として受け取ると仮定すると、

次のようなクラスまたはインターフェースがあるとします。

class Node<E> {
    public void addSubElement(E node) { ... }
}

そして、Nodeクラスはすべて次のようになります。

class Subnode1 extends Node<Subnode1>

次に、おそらく次のようにメソッドを記述できます。

public <E extends Node<E>> receive(List<Node<?>> list, E node){
    for (Node<?> element : list) {
         node.addElement(node.getClass().cast(element));
    }
}
于 2012-07-23T18:31:13.960 に答える
0

これに対する答えはなく、さまざまな方法でトピックに焦点を当てた多くの調査の後に手がかりがここに与えられているので、私は期待される解決策を指摘します。

どうすればクラスのタイプEにダウンキャストできますか、または少なくとも警告なしに安全な方法でそれを作成できますか?

于 2012-07-23T14:23:32.897 に答える