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/

相关文章:

java - 有人可以解释这个 "cannot be converted"Java 泛型错误吗?

java - 正则表达式将一个符号分组并忽略该符号的其他出现

java - 在 release 中编译时为 dex 进程返回代码 1

java - 泛型类和 Class<T>

android - 重新安装jre和jdk后eclipse无法运行

javascript - 编辑可写类型数组时,Svelte UI 未正确更新

php - 如何在 PHP 中合并 2 个带有数字索引的数组并替换值?

c - 为什么程序返回访问冲突?

c# - 将具体类转换为通用基接口(interface)

typescript - 编写一个在泛型上使用查找类型的函数