用一个例子解释问题:
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
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么"Arrays.asList(obj1)"不起作用?
在推断泛型方法的类型参数时,Java 7是愚蠢的(不是不是).例如,无论方法调用的上下文如何,它都将使用声明的参数类型来推断类型.所以
Arrays.asList(obj1);
Run Code Online (Sandbox Code Playgroud)
类型参数将被推断为
DataWrapper<Object>
Run Code Online (Sandbox Code Playgroud)
那么方法的返回类型将List<DataWrapper<Object>>不能分配给a List<DataWrapper<?>>.
在
Arrays.asList(obj1, objInt);
Run Code Online (Sandbox Code Playgroud)
从两个参数推断出类型.在两者之间发现了一种常见的类型.在这种情况下,那是? extends Object.方法返回类型变为List<DataWrapper<? extends Object>>可分配的类型List<DataWrapper<?>>.
在Java 8中,您发布的内容是开箱即用的.在Java 7中,您可以提供显式类型参数以使其工作
List<DataWrapper<?>> anyDataList = Arrays.<DataWrapper<?>>asList(obj1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |