这是《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)
//: 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)
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));
}
不太明白,怎么用ArrayList.toArray(String[])转?
是赋值语句出现错误,ia.array[0]应该就是个字符串呀。
把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范型有问题的体现了。还得再看看了。
这个T是什么 类型的。 - -求解,书上的么?
看来把T[] array行改成Object[] array,已改变书作者的原意了。我提的问题本来也是不改变原来代码的情况下,只添加main()而使程序运行。
难道作者的本意也就是代码管编译通过,不管能运行?
作者想表达的是这种方法在这里行不通,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]);
}}