有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是修复此行为的最干净的方法

假设我有一个包含50个不同类型的节点子类的列表,我希望这些子类是相同的类型,否则会得到一个类异常。我有一个方法来接收这个列表和一个节点,它持有并导出某个类型

我想这样做:

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

如果我不能转换为generic,那么做这样的事情会很好:

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

所有这些选项都将考虑到节点。addElement(E node),所以期望E。我想改变它来接受任何类型的节点并进行转换。但后来发生了:Why a List<type> absorbs not-type element in compilation and execution time?

我应该放弃第二种方法吗


共 (2) 个答案

  1. # 1 楼答案

    假设某个特定的节点类始终将其自己的节点类作为元素

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

    class Node<E> {
        public void addSubElement(E 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));
        }
    }