gpt4 book ai didi

java - 为什么这一行不能编译 List l = new ArrayList()?
转载 作者:行者123 更新时间:2023-12-02 02:27:05 24 4
gpt4 key购买 nike

我希望能够像这样列出一个列表 -

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 数组做类似的事情,它可以编译,但在运行时抛出异常。

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

那么允许后者代码编译而不允许前者编译的理由是什么?

编辑 - 如上所述,已经提出了类似的问题。这个问题也有帮助Why is the ArrayStoreException a RuntimeException?

最佳答案

正如您的链接所说,定义您的 List像这样:

List<? extends Object> l = new ArrayList<String>();

编辑

是的,原因是

List<? extends Object> l = new ArrayList<String>(); l.add("asda");

不起作用是为了避免运行时异常,因为列表的类型可以是扩展 Object 的任何类型所以编译器会这样对待它(可以是任何东西/未知)。但是,如果您保留对原始列表的引用,您仍然可以编辑该列表。

List<String> strList = new ArrayList<>();
List<? extends Object> objList = strList;
strList.add("asdf");
// Will return Strings that only have the Object interface
Object o = objList.get(0);

List<? extends Object>的目的只是为您的代码提供类型保证(在本例中是扩展 Object 的某种类型),并且编译器借助泛型能够在编译时确保该条件,但它还需要确保您不会违反原始 list 。以下面的代码为例:

List<Integer> intList = new ArrayList<>();
List<? extends Object> objList = intList;
// compile error to protect the original list
objList.add("asdf");

因为objList类型为?您不能添加 String到它。即使StringObject 的子类它可能与 ? 不同(在本例中也不是)相同的类型。 .

另外不要忘记,由于类型删除,泛型类型在运行时会消失。泛型是编译时间的保证。

另外,现在我明白了你真正的问题。

I need the reason for why is the same thing allowed for Arrays, why not compile time error in that case? Basically what I am asking is why do we have this dual policy, one for Arrays and a different policy for generic ArrayLists?

参见this问题及其相关答案

关于java - 为什么这一行不能编译 List<Object> l = new ArrayList<String>()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47655318/

24 4 0