Java泛型:无界通配符不能与Object类型参数一起使用

时间:2014-08-27 19:34:48

标签: java generics

通过示例解释问题:

public class DataWrapper<T> {
    T data;
};

DataWrapper<Object> obj1 = new DataWrapper<Object>();

List<DataWrapper<?>> anyDataList = Arrays.asList(obj1); //this doesn't work

DataWrapper<Integer> objInt = new DataWrapper<Integer>();
anyDataList = Arrays.asList(obj1, objInt); //this work

我无法理解为什么&#34; Arrays.asList(obj1)&#34;不起作用吗?

1 个答案:

答案 0 :(得分:9)

在推断泛型方法的类型参数时,Java 7是愚蠢的(不是不是)。例如,无论方法调用的上下文如何,它都将使用声明的参数类型来推断类型。所以在

Arrays.asList(obj1);

类型参数将被推断为

DataWrapper<Object>

该方法的返回类型将为List<DataWrapper<Object>>,这不能分配给List<DataWrapper<?>>

Arrays.asList(obj1, objInt);

从两个参数推断出类型。在两者之间发现了一种常见的类型。在这种情况下,那是? extends Object。方法返回类型变为List<DataWrapper<? extends Object>>,可分配给List<DataWrapper<?>>

在Java 8中,您发布的内容是开箱即用的。在Java 7中,您可以提供显式类型参数以使其工作

List<DataWrapper<?>> anyDataList = Arrays.<DataWrapper<?>>asList(obj1);