Java 使用泛型自定义类时的ClassCastException
我试图使用泛型构造一个简单的列表类。Java 使用泛型自定义类时的ClassCastException,java,Java,我试图使用泛型构造一个简单的列表类。 然而,当我试图打印出值时,它抛出了classcastexception。在声明和初始化泛型数组时是否有任何问题 class vector<E> { static int MAX_LEN = 1234567; E[] data; int[] prv; int to; int size; vector() { data = (E[])new Object[MAX_LEN];
然而,当我试图打印出值时,它抛出了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
}
}
}
类向量{
静态int MAX_LEN=1234567;
E[]数据;
int[]prv;
int到;
整数大小;
向量(){
数据=(E[])新对象[MAX_LEN];
prv=新整数[MAX_LEN];
to=-1;
尺寸=0;
对于(int i=0;i System.out.println(v.data[i]);//代码有一些地方出错
看起来,您在vector v=new vector();
从Object[]
到Integer[]
的强制转换将永远不会成功
例:
整数[]a=(整数[])新对象[]{};//此强制转换将永远不会成功
实际上,您只能将Object[]
强制转换为Object
或Object[]
当前,当您尝试在main()
方法中访问data
时,编译器为您Integer[]
输入的强制转换将在运行时失败。您不需要数据
数组,只需要数组中的值,您可以通过将以下方法添加到向量
类中来获得这些值
E getData(int index) {
return data[index];
}
在这种情况下,编译器会将转换添加到各个元素中,并为您提供正确的值。代码有一些地方出错
看起来,您在vector v=new vector();
从Object[]
到Integer[]
的强制转换将永远不会成功
例:
整数[]a=(整数[])新对象[]{};//此强制转换将永远不会成功
实际上,您只能将Object[]
强制转换为Object
或Object[]
当前,当您尝试在main()
方法中访问data
时,编译器为您Integer[]
输入的强制转换将在运行时失败。您不需要数据
数组,只需要数组中的值,您可以通过将以下方法添加到向量
类中来获得这些值
E getData(int index) {
return data[index];
}
在这种情况下,编译器会将强制转换添加到各个元素中,并为您提供正确的值。这里确实有两个选项。可以使用对象[]
类型的数组,也可以创建适当的泛型数组。下面是如何创建泛型数组
vector(Class<E> clazz) {
data = (E[])Array.newInstance(clazz, MAX_LEN);
向量(类clazz){
data=(E[])Array.newInstance(clazz,MAX_LEN);
这里确实有两个选项。使用对象[]
类型的数据
数组或创建适当的泛型数组。下面是如何创建泛型数组
vector(Class<E> clazz) {
data = (E[])Array.newInstance(clazz, MAX_LEN);
向量(类clazz){
data=(E[])Array.newInstance(clazz,MAX_LEN);
您阅读了吗?我检查了您的链接,我认为它不相关,因为它会引发异常,而不是打印对象的地址。但奇怪的是,我在类中添加了一个简单的getter方法后得到了正确的结果。仍然很困惑。您阅读了吗?我检查了您的链接,我认为它不相关,因为它会引发异常n而不是打印对象的地址。但奇怪的是,我在类上添加了一个简单的getter方法后得到了正确的结果。仍然感到困惑。将泛型类型数组转换为对象数组是不可能的,但是将泛型类转换为对象是可以的。对吗?转换为对象
将始终成功,因为它是all.Ex:Object a=(Object)new Object[]{};
将泛型类型数组转换为Object数组是不可能的,但是将泛型类转换为Object是可以的。对吗?转换为Object
将始终成功,因为它是所有对象的超级类型。Ex:Object a=(Object)new Object[]{};