大家都知道,泛型数组是不能直接用new分配空间的,只有先通过以Object数组方式分配空间再强制转化为泛型。
但是当我用了比较复杂的泛型参数时,出现了ClassCastException的异常,代码如下public class Test {
public static void main(String[] args){
Test.<Integer>test();
}
public static <T extends Comparable<T>> void test() {
T[] result = (T[]) new Object[10];
}
}如果<T extends Comparable<T>>改为<T>的话就可以顺利执行,想了半天还是找不出问题,望高手指教,谢谢。

解决方案 »

  1.   

    我想是因为Object和Comparable型之间转换障碍所致public class Test {
        public static void main(String[] args) {
            Test.<String> test();
        }    public static <T extends Comparable<T>> void test() {
            T[] result = (T[]) new String[10];
            result[0] = (T) new String("1");
            System.out.println(result[0]);
        }
    }理由是换成这样就ok
      

  2.   

    恩,应该是这个原因!!但是,这样的话我要在test()中新建一个T的泛型数组,应该怎么解决呢?泛型参数需要是<T extends Comparable<T>>,因为后面会涉及比较。
      

  3.   

    扩展一个Comparable型吧public class Test {
        public static void main(String[] args) {
            Test.<MyInteger> test();
        }    public static <T extends Comparable<T>> void test() {
            T[] result = (T[]) new MyInteger[10];
            result[0] = (T) new MyInteger(1);
            System.out.println(((MyInteger) result[0]).getValue());
        }
    }class MyInteger implements Comparable{
        int value;
        
        MyInteger(int value){
            this.value = value;
        }
        
        public void setValue(int value){
            this.value = value;
        }
        
        public int getValue(){
            return value;
        }    public int compareTo(Object o) {
            // TODO Auto-generated method stub
            return 0;
        }
    }
      

  4.   

    恩,按照你的思路定义了一个MyObject继承了Object,实现了Comparable<T>,现在可以用了,感谢哈
      

  5.   

    还是有个问题,如果利用函数传递一个参数 test(T[] data)然后再函数内利用data给我们生成的reslut数组赋值 result[0]=data[0];这里会发生ArrayStoreException异常,晕...感觉泛型这个东西入门简单,要精通还是很难啊。
      

  6.   

    哦,终于发现一个方法了,因为突然想到可以用接口名来生成对象,于是抱着试一下的感觉直接用Comparable来实例化数组,没想到竟然成功了,而且也赋值也没有问题。public static  <T extends Comparable <T> >  void test() {
         T[] result = (T[]) new Comparable[10];