同じタイプであると予想されるノードの特定のサブクラスの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番目のアプローチを破棄する必要がありますか?