【问题标题】:Arrays.asList("") returns List interface, how can object creation be possible in this case? [duplicate]Arrays.asList("") 返回 List 接口,这种情况下怎么可能创建对象呢? [复制]
【发布时间】:2015-07-22 17:48:05
【问题描述】:

我知道不能从这样的接口创建对象:

List list2 = new List();  // error.

当我使用 Arrays.asList() 时,我很困惑,因为这个函数返回 List 并且下面的代码完美运行:

List list1 = Arrays.asList("a","b","c");  // works perfectly

这个等式的右边返回列表。那么代码就变成了 List list1=new List();尽管右侧返回一个接口,但我不明白这怎么可能以及这段代码如何工作。你能解释一下吗? 提前致谢

【问题讨论】:

  • 那么代码就变成了List list1=new List();
  • 你不应该从数学上看它,还有更多。不,它不是被实例化的接口。在此处阅读有关polymorphism 的更多信息:docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
  • 你刚才问了一个问题,接受的答案也掩盖了你的困惑:here

标签: java arrays collections


【解决方案1】:

Arrays.asList(...) 返回一个新的 ArrayList。

由于多态性,它可以声明它返回一个 List,然后返回任何实现 List 接口的东西。 ArrayList一个列表,所以可以返回。

额外说明:asList 使用的 ArrayList 实际上是在 Arrays 类中作为匿名类创建的,它扩展了 ArrayList 类的功能以创建一个接受本机数组的构造函数。

【讨论】:

  • 在文档 docs.oracle.com/javase/7/docs/api/java/util/… 中,没有关于返回 arraylist 的说法,所以你对“Arrays.asList(...) 返回一个新的 ArrayList”是错误的。我认为。文档没有说明返回数组列表
  • 文档不一定提供有关内部实现的详细信息。要找出真实的故事,它表明它确实返回了一个 ArrayList,请检查实际代码。 grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
  • 是否可以通过 Eclipse 查看实现?我使用 ctrl 空格并单击该方法。但是出现了一个废话解释窗口
  • 是的,应该是。我认为通过控制并单击某个类。我在原始答案中提供的答案是否正确?如果是这样,则将其标记为这样。也可以在这里查看:stackoverflow.com/questions/426084/…
【解决方案2】:

列表是一个“接口”。您不能从接口创建新实例(通过new ...),您需要一个“真实”类。 Arrays.asList 是一个返回对象的方法。

对于您的第一个代码,您必须执行类似...

List list2 = new ArrayList();

ArrayList 是一个实现 List 接口的类。但是抱歉,我担心你需要参考一些基本的 Java 和 OOP 教程来了解类、接口、对象等到底是什么,因为这里不适合这样的事情。

【讨论】:

  • 我知道你的解释。但是我的困惑是不同的。如何使用返回接口的静态方法创建对象?
  • public static List createList() { return new ArrayList(); } 是最简单的例子。它创建了一个 ArrayList,并且因为ArrayList implements List(换句话说,ArrayList 也是一个 List),您可以返回为 List,从而从外部“隐藏”它究竟是什么类的事实。如果您要更改方法,例如更改为return new LinkedList();,没有人会哭泣,因为它仍然会返回一个列表,正如承诺的那样(因为LinkedList implements List)。
【解决方案3】:

问题是List 是一个接口,而不是一个类。 Java 下只能实例化类,不能实例化接口。因此,您要么需要创建一个实现List 的新类型(例如ArrayListLinkedList,即List list2 = new ArrayList();),要么可以通过调用创建列表的方法来获取列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2018-08-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多