这是《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]);
}}