此问题已有答案: 为什么数组是协变的而泛型是不变的?
此问题已有答案:
为什么数组是协变的而泛型是不变的?
我想要做一个这样的列表 -
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日
标准库实现的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是运行时异常?
ArrayStoreException
你可以直接写
类型参数仅存在于编译时,这没有任何区别。
用户名或电子邮箱地址
密码