我想知道如何在构造函数中初始化通用数组。
在google上搜索后,我写了下面的代码。
public class Test<E>{
private E[] mData;
public Test(){
mData = (E[])new Object[100];
}
public void put(E data, int index){
mData[index]=data;
}
public E get(int index){
return mData[index];
}
public static void main(String[] args){
Test<Integer> t1 = new Test<>();
t1.put(100, 0);
System.out.println(t1.get(0)); // 100
}
}
上述代码的输出预计为 100,但如果我直接访问通用数组,则会出现错误。
代码如下所示。
public class Test<E>{
private E[] mData;
public Test(){
mData = (E[])new Object[100];
}
public static void main(String[] args){
Test<Integer> t1 = new Test<>();
t1.mData[0] = 100;
System.out.println(t1.mData[0]);
// java.lang.ClassCastException error
}
}
上面的代码只是给了我一个 ClassCastException
错误。
我不知道我上传的这些代码有什么区别。
任何帮助都将不胜感激。
最佳答案
这里重要的是,mData
的类型始终是 Object[]
,即使它伪装成 E[]
。
在您的第一个示例中,在幕后发生以下情况:
public E get(int index){
Object x = mData[index];
E result = (E) x;
return result;
}
但是在第二个示例中,
// ClassCast
Integer[] tempArray = t1.mData;
System.out.println(tempArray[0]);
如果您确实希望数组的类型为 E[]
,请使用 Array.newInstance()
,但这确实会给构造函数引入不必要的参数。
您的方法更加用户友好(例如,ArrayList
执行相同的操作),只需确保不直接公开底层数组即可。
关于java - 直接访问通用数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58130787/