478

我无法像以下代码那样初始化列表:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

我面临以下错误:

无法实例化类型List<String>

我怎样才能实例化List<String>

4

13 回答 13

829

如果您检查APIList您会注意到它说:

Interface List<E>

作为一种interface手段,它不能被实例化(new List()不可能)。

如果您检查该链接,您会发现一些class实现的 es List

所有已知的实现类:

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack,Vector

其中一些可以实例化(那些未定义为 的abstract class)。使用他们的链接了解更多关于他们的信息,即:了解哪个更适合您的需求。

最常用的 3 个大概是:

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

奖励:
您还可以使用值以更简单的方式实例化它,使用Arrays class,如下所示:

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

但请注意,您不能向该列表添加更多元素,因为它是fixed-size.

于 2012-11-15T10:07:41.863 回答
178

无法实例化接口,但实现很少:

JDK2

List<String> list = Arrays.asList("one", "two", "three");

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

// creates immutable lists, so you can't modify such list 
List<String> immutableList = List.of("one", "two", "three");

// if we want mutable list we can copy content of immutable list 
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));

此外,其他库(如Guava )还提供了许多其他方法。

List<String> list = Lists.newArrayList("one", "two", "three");
于 2017-11-14T14:25:24.950 回答
41

List 是一个接口,你不能实例化一个接口,因为接口是一个约定,什么方法应该有你的类。为了实例化,您需要该接口的一些实现(实现)。使用非常流行的 List 接口实现尝试以下代码:

List<String> supplierNames = new ArrayList<String>(); 

或者

List<String> supplierNames = new LinkedList<String>();
于 2012-11-15T10:02:43.027 回答
16

您将需要使用ArrayList<String>或类似的。

List<String>是一个接口。

用这个:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();
于 2012-11-15T10:02:02.343 回答
13

List是一个接口,不能初始化一个接口。而是实例化一个实现类。

像:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
于 2012-11-15T10:02:16.523 回答
11

在大多数情况下,您想要简单ArrayList- 实现List

在 JDK 版本 7 之前

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

JDK 7 及更高版本可以使用菱形运算符

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

更多信息写在这里Oracle 文档 - 集合

于 2015-10-04T09:05:50.843 回答
9

List 只是一个接口,是一些通用列表的定义。您需要提供此列表接口的实现。最常见的两种是:

ArrayList - 在数组上实现的列表

List<String> supplierNames = new ArrayList<String>();

LinkedList - 一个像互连的元素链一样实现的列表

List<String> supplierNames = new LinkedList<String>();
于 2012-11-15T10:06:59.253 回答
7

根据您要使用的列表类型,例如

List<String> supplierNames = new ArrayList<String>();

应该让你去。

List 是接口,ArrayList 是 List 接口的一种实现。阅读List 接口的 JavaDocs可以找到更多可能更适合您需求的实现。

于 2012-11-15T10:03:00.153 回答
7

如果你只想创建一个只有一个对象的不可变 对象,你可以使用这个 API:List<T>

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

更多信息:文档

于 2017-09-21T20:49:53.663 回答
5

List 是一个接口。您不能使用 List 来初始化它。

  List<String> supplierNames = new ArrayList<String>();

这些是一些 List impelemented 类,

ArrayList, LinkedList, Vector

您可以根据您的要求使用其中的任何一个。这些每个类都有自己的特点。

于 2012-11-15T10:03:21.167 回答
3

以防万一,任何人仍然徘徊在这个问题上。因为,我看到一两个新用户再次问同样的问题,然后每个人都说,不,你不能那样做,亲爱的谨慎,除了这里给出的所有答案,我想提供额外的信息 - 是的,你实际上可以做,列表列表=新列表(); 但是以编写接口的所有方法的实现为代价。这个概念不仅仅是 List list = new List(); 但

List<Integer> list = new List<Integer>(){

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }

.....等等(不能写所有的方法。)

这是一个匿名类的例子。当有人说,不,你不能实例化一个接口时,它是正确的,这是正确的。但是你永远不能说,你不能写 List list = new List(); 但是,显然你可以做到这一点,这是一个很难说你做不到的声明。

于 2017-12-05T06:46:11.560 回答
3

代替 :

List<String> supplierNames = new List<String>();

如果您使用的是最新的 JDK,请写下:

 List<String> supplierNames = new ArrayList<>();

这是初始化列表的正确方法。

于 2021-05-21T17:39:09.550 回答
0

我们创建了soyuz-to来简化 1 个问题:如何转换XY(例如Stringto Integer)。对象的构造也是一种转换,所以它有一个简单的函数来构造Map, List, Set:

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

请检查它 - 它还有很多其他有用的功能

于 2019-08-17T20:59:59.957 回答