public void wahey(List<Object> list) {}
wahey(new LinkedList<Number>());
调用该方法不会进行类型检查。我甚至无法将参数转换为以下类型:
wahey((List<Object>) new LinkedList<Number>());
根据我的研究,我发现不允许这样做的原因是为了类型安全。如果我们被允许这样做,那么我们可能会出现以下情况:
List<Double> ld;
wahey(ld);
在方法wahey中,我们可以向输入列表添加一些字符串(因为参数维护了一个List<Object>
引用)。现在,在方法调用之后,ld引用了一个类型为List<Double>
的列表,但实际上列表包含一些字符串对象!
这似乎与没有使用泛型的Java的正常工作方式不同。例如:
Object o;
Double d;
String s;
o = s;
d = (Double) o;
我们所做的事情本质上是相同的,但这将通过编译时检查,并且只会在运行时失败。带有列表的版本将无法编译。
这让我相信这纯粹是关于通用类型限制的设计决策。我希望能够就此决策得到一些评论?
wahey((List<Object>) (List<?>) new ArrayList<Number>())
这样的双重转换虽然可以编译通过,但并不推荐使用。 - Robin479