为什么这行代码不会编译List l = new ArrayList()?
13 浏览
0 Comments

为什么这行代码不会编译List l = new ArrayList()?

此问题已有答案

为什么数组是协变的而泛型是不变的?

我想要做一个这样的列表 -

List l = new ArrayList();


标准库实现的ArrayList不允许这样做。它会在编译时报错。所以我正在写自己的ArrayList实现。

到目前为止,我尝试了这样做 -

public class ArrayList implements List {...}
public class ArrayList implements List {...}

但这样不会编译通过。那么,我该如何编写一个ArrayList,使我能够像上面那样使用它?

List l = new ArrayList();

有人提到了这篇文章

List是List的子类吗?为什么Java的泛型不是隐式多态的?

但我仍然不理解。给出的原因是我们希望避免这样的情况 -

List l = new ArrayList();
l.add(new Dog()); 

虽然这很有道理,但我可以用Java数组做类似的事情,它会编译通过但在运行时抛出异常。

Object o[] = new String[10];
o[0] = new Dog();

那么,为什么允许后者的代码编译通过而不允许前者呢?

编辑 - 上面已经指出了类似的问题已经被问过。

这个问题也有帮助:为什么ArrayStoreException是运行时异常?

admin 更改状态以发布 2023年5月20日
0
0 Comments

你可以直接写

List l = new ArrayList();

类型参数仅存在于编译时,这没有任何区别。

0