这是程序代码:
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)

解决方案 »

  1.   

    你直接想把一个object的数组转化为string的数组,这就是在不用泛型的时候也做不到啊。你在构造函数中明明声明了一个object的数组,但是你却要把它强制转化为T(string)的数组,当然会出错了。
      

  2.   

    你的那个T类型,也就是private   T[]   array; 可能没有定义吧,所以他无法转换!
      

  3.   

    你不能将 Object数组 转换成String数组你对泛型理解有点偏差  泛型是个编译器行为  
    最后 泛型类中的 T 编译成了 Class文件之后 是Object 你可以把T全部替换成Object了之后 再看
      

  4.   

        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);
        }
      

  5.   

    Object[]->String[]不行 反之则可以
    SuppressWarnings掩盖了编译器警告
    Type safety: The cast from Object[] to T[] is actually checking against the erased type Object[]
    array还是Object[]的
    可以得到Object数组之后 再将其元素转成String
      

  6.   

    array在你初始化时已经被定死为Object[]了,
    关键是array数组中放的东西才和范型有关,
    楼主可以增加一个取array里值的方法感受一下    public T get(int index) {
            return array[index];
        }
    arr2 = generic.getArray();等同于String[] = Object[],
    左右类型不相同自然就出错了
      

  7.   

    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]);
    }
    }给你改了 下   不知道合不合需求
      

  8.   

    array = (T[])new Object[10];
    这样做无法按预期转换成T[]类型是由于Type ErasureType erasure enables Java applications that use generics to maintain binary compatibility with Java libraries and applications that were created before generics. Type erasure就是为了保证与此前的java库与应用程序保持(二元)兼容
    以下几种都有问题
       
    public class MyClass<E> {    
        public static void myMethod(Object item) {        
            if (item instanceof E) {  
                //Compiler error            ...        
            }        
            E item2 = new E();   //Compiler error        
            E[] iArray = new E[10]; //Compiler error        
            E obj = (E)new Object(); //Unchecked cast warning    
        }
    }
      

  9.   

      其实我出错的地方,就是自己不明白,为什么在getArray()返回的类型也是T[]的,在main()方法中,
    我的的T-->Stirng了,为什么还是会出现ClassCastException异常! 
      还有一点就是构造方法里面那个是没有问题的啊,在eclispe里也没有报错,难道那个就是错误的根源??
      

  10.   

       仔细用eclipse看了看,的确如8楼所说!
      

  11.   

        首先你的问题根本就不是泛型的问题。是因为你在给array这个T[]类型的数组赋值时是循环调用了add方法,这个方法每次给array数组添加一个Object类型的元素,因此你用generic.getArray()实际返回的就是个内存中Object[]数组的引用,而不是一个内存中String[]数组的引用,只不过该数组中每一个元素都是Object类型,每个元素都存放了String值。
        内存中实际存放的Object[]数组不能强制转换成String[]。你只有让一个Object[]类型的数组变量去引用一个内存中的String[]类型数组,这样的Object[]数组变量才可以强制转换。
        为了让你看得更清楚些,只需改造一下main方法即可,其它地方不需要改动。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]);
      }
    //--------------------------------------从这以上都不需要改动,我已经实际运行过。
      Object[] objects=generic.getArray();  //该方法实际返回的是内存中的Object[]数组的引用
      arr2=new String[objects.length];    //让arr2去引用一个内存中的String[]数组肯定是合法的。
      for(int i=0;i<objects.length;i++){    // 循环遍历内存中的objects[]数组
        arr2[i]=(String)objects[i];//将数组中的objects[i]元素转换成String放到arr2引用的数组
      }
    /*
      内存中存放的那个Objects[]数组,每个元素依旧是Object类型,这个不能改变。但是Object[]数组变量objects可以去引用内存中的String[]数组。
    */
      System.out.println(objects);   //看看是不是[Ljava.lang.Object;@xxxxxx]。
      objects=arr2; //变量objects引用一个内存中的String[]数组,此时objects才能转换      System.out.println((String[])objects);//看看是不是[Ljava.lang.String;@xxxxxx]
      
    }