我试图使用泛型构造一个简单的列表类。
但是,当我尝试打印该值时,它将引发classcastexception。声明和初始化通用数组时有什么问题吗?
class vector<E> {
static int MAX_LEN = 1234567;
E[] data;
int[] prv;
int to;
int size;
vector() {
data = (E[])new Object[MAX_LEN];
prv = new int[MAX_LEN];
to = -1;
size = 0;
for(int i = 0; i < MAX_LEN; ++i) {
prv[i] = -1;
}
}
void push_back(E e) {
data[size] = e;
prv[size] = to;
to = size;
++size;
}
}
public class Main {
public static void main(String[] args) throws Exception {
vector<Integer> v = new vector();
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for(int i = v.to; i != -1; i = v.prv[i]) {
System.out.println(v.data[i]); //<- Exception here
}
}
}
答案 0 :(得分:1)
代码有些错误。
<>
行中的vector<Integer> v = new vector();
Object[]
到Integer[]
的投射将永远不会成功例如:
Integer [] a =(Integer [])new Object [] {}; //此强制转换永远不会成功
事实上,您只能将Object[]
投射到Object
或Object[]
。
当前,当您尝试使用data
方法访问main()
时,编译器为您Integer[]
进行的强制转换将在运行时失败。您不需要data
数组,只需要其中的值,可以通过将以下方法添加到vector
类中来获得。
E getData(int index) {
return data[index];
}
在这种情况下,编译器会将强制类型转换添加到各个元素中,并为您提供正确的值。
答案 1 :(得分:1)
您这里确实有两个选择。使用data
类型的Object[]
数组或创建适当的通用数组。这是创建通用数组的方法。
vector(Class<E> clazz) {
data = (E[])Array.newInstance(clazz, MAX_LEN);