【发布时间】:2015-06-26 21:31:40
【问题描述】:
我正在使用返回类型 List<> 的方法,然后我可以在该 List 上调用方法:
List<Artist> artists = artistsPager.artists.items;
artists.add(new Artist());
要明确artistsPager.artists.items 是返回类型List<Artist>。
既然List 只是一个接口,编译器怎么让我使用这个artists 对象,List<> 不是总是需要一个实现,比如ArrayList?
例如,编译器不会让我执行以下操作,因为“列表是抽象的;无法实例化”:
List<Integer> list = new List<Integer>();
artistsPager.artists.items 与 new List<Integer>() 有何不同?
对于那些好奇的人,这来自Java Web API wrapper for Android。非常感谢所有帮助。
我不相信这是question 的重复,因为即使答案相同,但引发他们的问题却不同。另一个问题是问List 和ArrayList 类型之间的区别,而我的问题是想知道为什么当List 的实现被隐藏时编译器没有抱怨。
我可以将其标记为重复项以将未来用户引导至该问题,但我认为不应该关闭它,因为我认为这里的答案对其他用户非常有帮助。
【问题讨论】:
-
您应该查找接口/抽象类,看看它们是如何在 Java 中使用的。这是一套重要的知识,尤其是在处理像 Android 和 JDK 这样的高配置库时,因为接口几乎在它们的任何地方都使用。
-
感谢@DaveLugg,我很困惑,因为我查看了 Spotify API 的源代码,除了类型 List 之外找不到任何它的实例化。下次我会相信编译器!有没有什么快速的方法可以找出 List 的实际实现位置,而不是遍历代码?
-
使用接口的重点是你不应该关心它在哪里实现,只要它是一个
List。ArrayList类型是它的一个实现,并且可能是最常见的。所以你可以使用List<Integer> list = new ArrayList<Integer>();。您可以在 oracle 文档 (docs.oracle.com/javase/6/docs/api/java/util/List.html) 中找到 List 接口的默认实现,并查看“所有已知的实现类” -
知道了,感谢@DaveLugg 的帮助。
标签: java list interface spotify