关于java:为什么是List< Number>

Why is List<Number> not a sub-type of List<Object>?

1
2
3
public void wahey(List<Object> list) {}

wahey(new LinkedList<Number>());

对方法的调用将不会进行类型检查。我甚至无法将参数强制转换为以下类型:

1
wahey((List<Object>) new LinkedList<Number>());

从我的研究中,我总结出不允许这样做的原因是类型安全。如果允许我们这样做,那么我们可以有以下内容:

1
2
List<Double> ld;
wahey(ld);

在方法wahey中,我们可以向输入列表添加一些字符串(因为参数维护一个List引用)。现在,在方法调用之后,ld引用了一个类型为List的列表,但是实际的列表包含一些字符串对象!

这与Java没有泛型的正常工作方式不同。例如:

1
2
3
4
5
6
Object o;
Double d;
String s;

o = s;
d = (Double) o;

我们在这里所做的基本上是相同的,除了这将通过编译时检查,并且只在运行时失败。带有列表的版本无法编译。

这让我相信这纯粹是一个关于泛型类型限制的设计决策。我希望能得到一些关于这个决定的评论?