您看到的内容的解释是由于 类型擦除引起的 。这是编译器执行类型擦除 后 的
genericMethod()样子: __
public static Object[] genericMethod(List input) { Object[] res = new Object[input.size()]; int i = 0; for (Object t : input) { res[i] = t; i++; } return res;}换句话说,此方法将返回type数组
Object。无法将an转换
Object[]为an,
Integer[]因为它们不是同一类型。如果希望方法能够动态返回所需的类型,则可以使用
Array.newInstance()。这还需要传入想要的数组类型作为输入参数:
public static <T> T[] genericMethod(Class<T> clazz, List<T> input) { @SuppressWarnings("unchecked") T[] res = (T[]) Array.newInstance(clazz, input.size()); int i = 0; for (T t : input) { res[i] = t; i++; } return res;}现在,您的代码段将运行而不会出现错误:
linkedList<Integer> list = new linkedList<Integer>(); Integer[] i = genericMethod(Integer.class, list);
更新:
genericMethod2()类型擦除后,您的第二种方法如下所示:
public static Object genericMethod2(List input) { return input.get(0);}它将返回输入列表的第一个元素,强制转换为
Object。这是该方法的用法:
Integer j = genericMethod2(list);
编译器将尝试将输出强制转换
genericMethod2()为
Integer:
Integer j = (Integer)genericMethod2(list);
此强制转换是合法的,因为所有人
Integer也都是
Object,并且在这里成功,因为您传入了的集合
Integer。第二种方法与您为我们强调的第一种方法不同。



