泛型类型转换异常:
这是程序代码:
public class Generic <T>
{
private T[] array;
private int index = 0;
@SuppressWarnings("unchecked")
public Generic(){
array = (T[])new Object[10];
}
@SuppressWarnings("unchecked")
public Generic(int length){
array = (T[])new Object[length];
}
public void add(T t){
array[index ++ ] = t;
}
public void setArray(T[] array){
this.array = array;
}
public T[] getArray(){
return this.array;
}
public static void main(String[] args)
{
String[] arr1 = {"zhongjinjin","zhongguilin","zhongyao","zhongshi"};
String[] arr2 = null;
Generic <String> generic = new Generic <String>();
for(int i = 0; i < 10; i ++){
generic.add(arr1[i%4]);
}
arr2 = generic.getArray();//有问题的地方,不知道是什么原因?
System.out.println(arr2);
}
}
运行之后出现的问题
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at com.zz.jdk5.Generic.main(Generic.java:41)
------解决方法--------------------------------------------------------
你直接想把一个object的数组转化为string的数组,这就是在不用泛型的时候也做不到啊。你在构造函数中明明声明了一个object的数组,但是你却要把它强制转化为T(string)的数组,当然会出错了。
------解决方法--------------------------------------------------------
你不能将 Object数组 转换成String数组
你对泛型理解有点偏差 泛型是个编译器行为
最后 泛型类中的 T 编译成了 Class文件之后 是Object
你可以把T全部替换成Object了之后 再看
------解决方法--------------------------------------------------------
String[] arr1 = { "zhongjinjin", "zhongguilin", "zhongyao", "zhongshi" }; Object[] arr2 = null; Generic<String> generic = new Generic<String>(); for (int i = 0; i < 10; i++) { generic.add((String) arr1[i % 4]); } arr2 = generic.array;// 有问题的地方,不知道是什么原因? for (Object o : arr2) { System.out.println(o); }
------解决方法--------------------------------------------------------
Object[]->String[]不行 反之则可以
SuppressWarnings掩盖了编译器警告
Type safety: The cast from Object[] to T[] is actually checking against the erased type Object[]
array还是Object[]的
可以得到Object数组之后 再将其元素转成String
------解决方法--------------------------------------------------------
array在你初始化时已经被定死为Object[]了,
关键是array数组中放的东西才和范型有关,
你可以增加一个取array里值的方法感受一下
public T get(int index) { return array[index]; }
------解决方法--------------------------------------------------------
import java.lang.reflect.Array;public class Generic { private Object array; private int index = 0; @SuppressWarnings("unchecked") public Generic(Class c) throws Exception { array = Array.newInstance(c, 10); } @SuppressWarnings("unchecked") public Generic(Class c, int length) throws Exception { array = Array.newInstance(c, 10); } public void add(Object t) { Array.set(array, index++, t); } public void setArray(Object array) { this.array = array; } public Object getArray() { return array; } public static void main(String[] args) throws Exception{ String[] arr1 = { "zhongjinjin", "zhongguilin", "zhongyao", "zhongshi" }; String[] arr2 = null; Generic generic = new Generic(String.class); for (int i = 0; i < 10; i++) { generic.add(arr1[i % 4]); } arr2 = (String[]) generic.getArray();// 有问题的地方,不知道是什么原因? System.out.println(arr2[0]); }}
------解决方法--------------------------------------------------------
array = (T[])new Object[10];