gpt4 book ai didi

java - 为什么 List 在编译和执行时吸收非类型元素?

转载 作者:行者123 更新时间:2023-11-29 10:05:04 24 4
gpt4 key购买 nike

我有这个演示,我不需要一个带有重绘架构的特定解决方案,但只需要了解为什么会有这样的行为以及我为避免它而遗漏的任何东西。我想知道为什么:

  • 编译器允许将不是列表类型的元素插入到列表中
  • 当我们尝试获取元素而不是推送元素时抛出 ClassCast 异常

    import Test.*; //Inner classes
    import java.util.List;
    import java.util.ArrayList;

    public class Test<E extends Object> {

    private List<E> list = new ArrayList<E>();
    public Test() {}

    public static void main(String[] args) {
    Test<String> a = new Test<String>();
    a.addElement(new String());
    a.addElement(new Integer(0)); // No complain in comp/run-time, I dont understand why CastException is not thrown here
    String class1 = a.getElement(0);
    String class2 = a.getElement(1); //No complain in comp but ClassCastException: Integer cannot be cast to String
    //Integer class3 = a.getElement(1); //Compilation error
    }

    public void addElement (Object node) { list.add((E) node); } //No complain in comp/run-time
    public E getElement(int index) { return list.get(index); }
    }

有什么解决方案?请注意我需要传递父类(super class)而不是类型 E 的 addElement 行。这是我的架构所需要的,这只是一个简单的模拟演示。但无论如何,转换为类型 E 应该按预期进行并在运行时抛出 CastExeption,不是吗?

最佳答案

您的 addElement 方法没有正确使用泛型来捕获编译时错误。应该是:

public void addElement(E node) {
list.add(node);
}

一旦你使用 Object cast 并将其转换为 E,你就失去了编译时类型检查的好处。这就是我们首先使用泛型的原因,以避免使用 Object 变量并避免强制转换。

请注意,由于泛型删除,在运行时列表只是一个对象列表,因此当您将对象放入列表时,第一次转换甚至不会发生。但是,当您从列表中提取项目并需要将其分配给具体类型变量时,确实会发生幕后转换,这会导致抛出异常。

关于java - 为什么 List<type> 在编译和执行时吸收非类型元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com