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

标签 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 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/

相关文章:

arrays - 从由任意两个或多个连续自然数相乘形成的排序数组中查找第 N 个数字

由于设计选择,java泛型很重

java - 在 Java 中搜索 JList

java - 给定一个数字数组,任务是仅打印那些只有 1、2 和 3 作为数字的数字

java - Swing JTextField 进行文本更改

Javascript 正则表达式错误可能需要回顾类型的功能?

c# 在另一个 List<T> 中搜索 List<t>

java - 当您可以只使用具体类型时,为什么会有带有上限的通配符?

java - 某些 Java 8 功能可以在 Android SDK 23 中使用,而其他功能则不能?

java - servlet 中单例的垃圾收集