首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Exception >

泛型类型转换异常

2014-01-26 
泛型类型转换异常:这是程序代码: public class Generic T{ private T[] array private int index 0 @

泛型类型转换异常:

这是程序代码:
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了之后 再看
------解决方法--------------------------------------------------------

Java code
 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里值的方法感受一下
Java code
 public T get(int index) {  return array[index]; }
------解决方法--------------------------------------------------------
Java code
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]); }}
------解决方法--------------------------------------------------------
Java code
array = (T[])new Object[10];        

热点排行