下面是两种方法,其中一种方法将Object转换为Generic类型,另一种方法将Object []转换为Generic类型数组。
public static <T> T returnElement(T a){
Object obj = new Object();
return (T)obj;
}
public static <T> T[] returnArray(T[] a){
Object obj[] = new Object[10];
return (T[])obj;
}
当我打印两种方法的结果时,将Object []转换为Generic类型[]成功并打印java.lang.Object。我无法理解为什么returnArray()不会抛出ClassCastException,两者之间的区别是什么?
System.out.println(ArrayAlg.<String>returnArray(new String[]{"a","b","c"})); // prints java.lang.Object
System.out.println(ArrayAlg.<String>returnElement("s")); //ClassCastException
答案 0 :(得分:2)
这是因为println
方法的重载。对于数组,它没有特殊的重载,println(Object)
将被调用,因此没有转换。对于单个元素,在编译时选择println(String)
重载,并且在>>返回Object值后完成转换。
此外,数组在Java中是协变的(尽管在前面介绍泛型的情况下它们应该是不变的)。如果由于类型擦除而将强制类型转换为Object[]
和Object
的方法,则不存在ClassCastException
。