下面是两种方法,一种将 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 type[] 成功并打印 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
最佳答案
这是因为 println
方法的重载。对于数组,它没有特殊的重载,将调用 println(Object)
,因此无需进行强制转换。对于单个元素,在编译时选择了 println(String)
重载,并且在返回对象值之后完成了转换。
此外,数组在 Java 中是协变的(尽管在早期引入泛型的情况下它们应该是不变的)。如果由于类型删除而将方法强制转换为 Object[]
和 Object
,则不会出现 ClassCastException
。
关于java - 将对象转换为泛型类型失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665492/