java - 为什么 ArrayList<E> 构造函数允许原始 ArrayList 参数

标签 java generics type-erasure raw-types

为什么这段代码可以编译:

ArrayList strings = new ArrayList();
strings.add("s1");
strings.add("s2");

ArrayList<Integer> numbers = new ArrayList<Integer>(strings);

考虑到相关构造函数需要 Collection<? extends E>哪里E在这种情况下是整数?原始类型中如何包含对象 ArrayList E 的子类?或者是否有一些隐藏的编译器魔法可以允许此用于遗留目的?

最佳答案

检查ArrayList构造函数:

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // replace with empty array.
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

elementData是对象数组:

transient Object[] elementData;

很新ArrayList(Collection<? extends E> c)将接受所有Collection ,不在乎E类型

它会抛出 ClassCastExceptionwhen当我们使用它时:

Integer i= numbers.get(1);

关于java - 为什么 ArrayList<E> 构造函数允许原始 ArrayList 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40650944/

相关文章:

java - 通过类型删除来欺骗集合

java - 为什么删除会使实现函数类型复杂化?

java - 如何仅传递常见对象的第三个列表?

java - 使用java(Netbeans)中的GATE库进行POS标记

swift - 使用协议(protocol)切换通用数值函数

c# - 如何将泛型类型转换为非泛型类型

c# - 我可以将未知对象强制转换为接口(interface)以便我可以在 C# 中访问它的属性吗?

java - 在 JRE 8 中使用 JavaFX, “Access restriction” 错误

java - 每次调试/部署时应用程序数据是否被删除?安卓 Eclipse

c++ - 使用类型删除在 C++11 中删除 void*