通过示例解释问题:
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;不起作用吗?
答案 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);