【发布时间】:2018-05-19 05:08:50
【问题描述】:
我希望能够列出这样的清单 -
List<Object> l = new ArrayList<String>();
ArrayList 的标准库实现不允许这样做。它给出了编译时错误。所以我正在编写自己的ArrayList 实现。
到目前为止,我已经尝试过这个 -
public class ArrayList<Y extends X> implements List<X> {...}
public class ArrayList<X super Y> implements List<X> {...}
不编译。
那么,我该如何编写一个 ArrayList 以便我可以像上面提到的那样使用它?
List<Object> l = new ArrayList<String>();
有人指出了这篇文章 Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?
但我还是不明白。给出的原因是我们想避免这样的情况 -
List<Object> l = new ArrayList<String>();
l.add(new Dog());
虽然这是有道理的,但我可以用 Java Arrays 做类似的事情,它可以编译但在 runtime 时抛出异常。
Object o[] = new String[10];
o[0] = new Dog();
那么允许后者代码编译但不允许前者编译的原因是什么?
编辑 - 类似的问题已经被问过,如上所述。 这个问题也有帮助Why is the ArrayStoreException a RuntimeException?
【问题讨论】:
-
为什么链接的问题没有回答您的问题?我的意思是它解释了为什么 Java 不支持这种语法。如果不是这样,您到底想达到什么目标?如果您编写
new ArrayList<String>(),该列表将仅接受String及其子类型。如果你改为写new ArrayList<Object>(),你可以添加所有你想要的。 -
你是说你宁愿在运行时出现异常而不是编译错误?这似乎没有多大意义。
-
不,我不是这么说的。我只是问这背后的原因是什么。
-
嗯,泛型的全部意义在于避免运行时异常,所以……你还需要什么其他理由?
-
我需要解释为什么数组允许同样的事情,在这种情况下为什么不编译时错误?基本上我要问的是为什么我们有这个双重政策,一个针对数组,另一个针对通用数组列表?
标签: java list generics inheritance arraylist