将对象转换为泛型类型失败

时间:2014-12-27 08:02:56

标签: java arrays generics casting

下面是两种方法,其中一种方法将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

1 个答案:

答案 0 :(得分:2)

这是因为println方法的重载。对于数组,它没有特殊的重载,println(Object)将被调用,因此没有转换。对于单个元素,在编译时选择println(String)重载,并且在>返回Object值后完成转换。

此外,数组在Java中是协变的(尽管在前面介绍泛型的情况下它们应该是不变的)。如果由于类型擦除而将强制类型转换为Object[]Object的方法,则不存在ClassCastException