这是《Java 编程思想》中的一个例子,曲线创建Java范型数组的。下面代码main()方法内的是我加的。作者说是可以的,但为何我运行不了,怎样改能让它运行?
//: arrays/ArrayOfGenericType.java
// Arrays of generic types won't compile.
import java.util.*;public class ArrayOfGenericType<T> {
  T[] array; // OK
  @SuppressWarnings("unchecked")
  public ArrayOfGenericType(int size) {
    //! array = new T[size]; // Illegal
    array = (T[])new Object[size]; // "unchecked" Warning
  }
  // Illegal:
  //! public <U> U[] makeArray() { return new U[10]; }
public static void main(String[] args) {
ArrayOfGenericType<String> ia = new ArrayOfGenericType<String>(11);
ia.array[0] = "World";  // line 16 ia.array[1] = "Hello";
System.out.println(Arrays.toString(ia.array));
}
} ///:~编译、运行结果如下:
C:\> javac ArrayOfGenericType.java
C:\> java ArrayOfGenericType
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
        at ArrayOfGenericType.main(ArrayOfGenericType.java:16)

解决方案 »

  1.   

    数据类型转换有问题~!对象类型不能转化为String类型~! 你在好好看看
      

  2.   

    想把那一行用红色字体显示,没想就错行了。main()方法内的是:
    public static void main(String[] args) {
    ArrayOfGenericType<String> ia = new ArrayOfGenericType<String>(11);
    ia.array[0] = "World"; // line 16 
    ia.array[1] = "Hello";
    System.out.println(Arrays.toString(ia.array));
    }
      

  3.   

    不能直接转,for循环一个一个转吧
      

  4.   


    不太明白,怎么用ArrayList.toArray(String[])转?
    是赋值语句出现错误,ia.array[0]应该就是个字符串呀。
      

  5.   

    Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;用6楼的方法就可以的.
      

  6.   

    array = (T[])new Object[size];这一句是会提示类型安全警告的,你用@SuppressWarnings("unchecked")掩盖了,array在这并不能向下转型为String[],所以下面的赋值操作会报错。
      

  7.   


    把T[] array行改成Object[] array, 果然好了!
    import java.util.*;public class ArrayOfGenericType<T> {
    Object[] array;
    @SuppressWarnings("unchecked")
    public ArrayOfGenericType(int size) {
    array = (T[])new Object[size]; // "unchecked" Warning
    }
    public static void main(String[] args) {
    ArrayOfGenericType<String> ia = new ArrayOfGenericType<String>(11);
    ia.array[0] = "World";
    ia.array[1] = "Hello";
    System.out.println(Arrays.toString(ia.array));
    }
    }
    编译、运行:
    D:\> javac ArrayOfGenericType.java
    D:\> java ArrayOfGenericType
    [World, Hello, null, null, null, null, null, null, null, null, null]
    这是想要的结果。可再进行下面的测试。
    在main()方法中,改类型<String>为<Double>,
    public static void main(String[] args) {
    ArrayOfGenericType<Double> ia = new ArrayOfGenericType<Double>(11);
    ia.array[0] = 123.40;
    ia.array[1] = "Hello";
    ia.array[2] = 9.00;
    System.out.println(Arrays.toString(ia.array));
    }
    编译、运行,得到结果:
    PS D:\java\source> java ArrayOfGenericType
    [123.4, Hello, 9.0, null, null, null, null, null, null, null, null]
    字符串也能加到Double数据里!不知这是否就是所谓的Java范型有问题的体现了。还得再看看了。
      

  8.   

    T[] array; // OK用Object肯定能好了,T[] array; // OK
     这个T是什么 类型的。 - -求解,书上的么?
      

  9.   

    都讲了array在这并不能向下转型为String[],你可以打印array的类型信息看看,然后自己new一个String[],看看它的类型信息跟你这个array有啥不同。你第二个Double类型测试中,你打印下ia.array的类型信息,然后再看看ia.array[0……2]每个元素的类型信息看看,你就明白了。
      

  10.   

    ia.array 原来是Object[]类型的!难怪什么都能装了。
    看来把T[] array行改成Object[] array,已改变书作者的原意了。我提的问题本来也是不改变原来代码的情况下,只添加main()而使程序运行。
    难道作者的本意也就是代码管编译通过,不管能运行?
      

  11.   

    array = (T[])new Object[size]; // "unchecked" Warning
      

  12.   

    这是个解释错误的例子。此例本身就有错误。楼主看书有点断章取义了。
    作者想表达的是这种方法在这里行不通,ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;正确的写法在在书中是有的:
    import java.lang.reflect.Array;public class ArrayOfGenericType<T>{
    T[] array; 
    @SuppressWarnings("unchecked")
    public ArrayOfGenericType(Class<T> type, int size){
                   //运用反射类Array
    array = (T[])Array.newInstance(type, size);
    }
    public void put(int index, T item){
    array[index] = item;
    }
    public T get(int index){
    return array[index];
    }
    public T[] rep(){
    return array;
    }
    public static void main(String[] args)
    {
    ArrayOfGenericType<String>  aogt = new ArrayOfGenericType<String>(String.class, 5);
    String[] buffer = aogt.rep();

    buffer[0] = "Hello";
    buffer[1] = "World"; System.out.println(buffer[0]);
    System.out.println(buffer[1]);
    }}