日期:2014-05-20  浏览次数:20754 次

《Java 编程思想》中的一个例子,为何运行不了?
这是《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)


------解决方案--------------------
这是个解释错误的例子。此例本身就有错误。楼主看书有点断章取义了。
作者想表达的是这种方法在这里行不通,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]);
}}