0

想象一下,我有一个包含 50 个不同类型的 Node 子类的列表,我希望它们是相同的类型,否则会得到 ClassException。我有一个接收这个列表的方法和一个持有和 expeting 某种类型的节点

我想做这样的事情:

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节点),所以期待E。我想改变它以接受任何类型的节点并进行演员表。但后来发生了这样的事情:为什么 List<type> 在编译和执行时吸收非类型元素?

我应该放弃第二种方法吗?

4

2 回答 2

1

假设一个特定的 Node 类总是将它自己的节点类作为元素,

假设您有一个类或接口,例如:

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 回答