Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-ArrayList未对其实例字段使用形式类型参数;elementData“;_Java - Fatal编程技术网

Java-ArrayList未对其实例字段使用形式类型参数;elementData“;

Java-ArrayList未对其实例字段使用形式类型参数;elementData“;,java,Java,ArrayList选择仅在其实例变量elementData中使用引用类型Object 使用对象作为其引用类型将需要显式强制转换来获取其元素的正确实例类型。如果只是在声明所述实例字段时使用类型参数,有什么区别 这样,我认为它可以消除抑制未经检查的显式强制转换的需要 // From Java API: public E get(int index) { rangeCheck(index); return elementData(index); } @SuppressWarning

ArrayList选择仅在其实例变量
elementData
中使用引用类型
Object

使用
对象
作为其引用类型将需要显式强制转换来获取其元素的正确实例类型。如果只是在声明所述实例字段时使用类型参数,有什么区别

这样,我认为它可以消除抑制未经检查的显式强制转换的需要

// From Java API:
public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

@SuppressWarnings("unchecked")
E elementData(int index) {
    return (E) elementData[index];
}
可能是这样吗

private transient E[] elementData;

public E get(int index) {
    rangeCheck(index);

    return elementData[index];
}
请分享你的想法。干杯

由于“”的原因,类型信息仍将丢失。Java泛型中的类型信息可以帮助编译器在开发人员试图使用不正确的类型时发出错误


然而,我认为在那里使用Object的主要原因是ArrayList也在分配元素。Java不允许您执行
新建E[startCapacity]
ArrayList(int initialCapacity)
构造函数正是这样做的。

我已经得到了答案,这是从Joshua Bloch的“有效Java第二版”中得到的。它在第26项中说

您选择哪种技术来处理泛型数组 创作错误在很大程度上取决于品味。在其他条件相同的情况下,风险更大 禁止对数组类型而不是标量类型执行未经检查的强制转换,这将 提出第二种解决方案。但在比Stack更现实的泛型类中,您可以 可能会在代码中的多个点读取数组,因此选择 第二种解决方案需要对E进行多次转换,而不是对E进行一次转换[], 这就是为什么第一种解决方案更常用的原因[Naftalin07,6.7]


ArrayList在处理泛型数组创建时使用了第二种技术,即禁止转换为标量类型。

cool。但是如果你能做到这一点,为什么要使用
newe[]
<代码>(E[])新对象[初始容量]当您尝试对该数组的元素执行任何操作时,您将得到一个异常。很可能是
ClassCastException
。对此不太确定。这里:
public ArrayDeque(){elements=(E[])新对象[16];}
假设E是MyType,MyType有void doSomething()方法。现在尝试
元素[0]-这就是我要说的。它仍然是一个对象引用数组!