-1

为什么1ok但是2compilation error,因为3我们得到warning messageList是原始类型。对泛型类型的引用List<E>应该被参数化)并4再次给出compilation error

1- List<Integer> list = new ArrayList<Integer>()//Ok
2- List<Integer> list = new List<Integer>()//compilation error
3- List<List> list = new ArrayList<List>()//Warning
4- List<Integer> list = new List<Integer>()//Compilation error
4

6 回答 6

4

List是一个interface

ArrayList是一个类implements List

List其视为可以具有多个实现的合同(ArrayListLinkedList

于 2013-10-17T04:16:30.737 回答
2
  1. ArrayList是类,可以实例化。所以,1没问题。
  2. List是界面。您无法实例化接口。因此,2 和 4 中的编译错误。
于 2013-10-17T04:16:40.580 回答
2

似乎您对 Java 很陌生。原因是 List 是一个接口。如果您看到接口的定义,则无法实例化它。ArrayList 是可以实例化的 List 接口的实现。

于 2013-10-17T04:18:08.080 回答
1
1 - List<Integer> list = new ArrayList<Integer>()//Ok  

因为ArrayListimplements ListsoArrayList 是 a List并且它可以被类型的引用变量指向List

2- List<Integer> list = new List<Integer>()//compilation error  

您不能将对象创建List接口而不是类。

3- List<List> list = new ArrayList<List>()//Warning

因为内部List不知道它会存储什么类型的对象,所以应该是这样的

List<List<String>> list = new ArrayList<List<String>>()

删除警告

4- List<Integer> list = new List<Integer>()//Compilation error

您不能将对象创建List接口而不是类。

于 2013-10-17T04:30:42.700 回答
0

在面向对象编程中,我们有能力编写自己实际上并不存在的东西。列表就是其中之一,它是一个接口。接口实际上并没有对代码做任何事情,而是充当承诺或合同。

有很多不同的方法来创建一个列表 - 有些在某些应用程序中较慢,有些则更快。最流行的两个是 ArrayList 和 LinkedList。ArrayList 在数组中支持您的列表,支持非常快速的索引 - 您可以非常快速地将对象置于位置 n。LinkedLists 在添加和删除新对象方面更快(实际上并非如此,原因比这更深一些)。在某些情况下,一个可能更好,在其他情况下,另一个可能更好。

因此,如果我创建一个通过列表并获取每个项目中的数据的方法,我不会依赖于任何一个 List 实现的特殊功能。我应该选择哪一个?我是否应该强迫用户从他的 LinkedList 创建一个 ArrayList 只是因为我武断地决定那是我要使用的那个?

列表就是这里的答案。我不会对他们如何创建列表做任何假设,我所做的只是依赖一些我知道将在每个列表中出现的方法,所以我不会让用户符合我的要求。但是 List 本身没有任何要实例化的东西——当你调用 new List() 时,它是什么意思?好吧,这并不意味着什么。

但是,你可以做

List<String> stringList = new ArrayList<String>()

这是为什么?在我实际实现的列表 ArrayList 中调用了“新”。这不是它的常见用法,但它是允许的,因为背后实际上有一个真实的列表 - 而不仅仅是一个列表的承诺。

于 2013-10-17T04:27:27.840 回答
0

Listjava.util.collection包中的接口。您不能实例化接口。

ArrayList 是 List 接口的具体实现。

ArrayList implements List
于 2013-10-17T04:19:55.620 回答