【问题标题】:casting object to generic type fails将对象转换为泛型类型失败
【发布时间】:2014-12-27 08:02:55
【问题描述】:

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

【问题讨论】:

  • 您的第二个示例返回一个泛型类型的数组(即String)。您的第一个示例返回泛型类型(StringObject 不是 String,您不能将其转换为一个)。

标签: java arrays generics casting


【解决方案1】:

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

此外,数组在 Java 中是协变的(尽管它们应该是不变的,以防前面引入泛型)。如果由于类型擦除而强制转换为Object[]Object 的方法,则没有ClassCastExceptions。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多