我无法按照以下代码初始化列表:
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>
?
我无法按照以下代码初始化列表:
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>
?
Answers:
如果您检查API,List
则会注意到它说:
Interface List<E>
作为一种interface
手段,它不能被实例化(new List()
不可能)。
如果您检查该链接,则会发现一些class
实现的List
:
所有已知的实施类:
AbstractList
,AbstractSequentialList
,ArrayList
,AttributeList
,CopyOnWriteArrayList
,LinkedList
,RoleList
,RoleUnresolvedList
,Stack
,Vector
那些可以实例化。使用它们的链接可以了解有关IE的更多信息:知道哪种更适合您的需求。
三种最常用的可能是:
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
。
ArrayList
,请使用new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
无法实例化接口,但实现很少:
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");
您将需要使用ArrayList<String>
等。
List<String>
是一个接口。
用这个:
import java.util.ArrayList;
...
List<String> supplierNames = new ArrayList<String>();
列表只是一个接口,一些通用列表的定义。您需要提供此列表接口的实现。最常见的两个是:
ArrayList-在数组上实现的列表
List<String> supplierNames = new ArrayList<String>();
LinkedList-像一个互连的元素链一样实现的列表
List<String> supplierNames = new LinkedList<String>();
在大多数情况下,您想要简单ArrayList
-实现List
在JDK版本7之前
List<String> list = new ArrayList<String>();
JDK 7及更高版本可以使用菱形运算符
List<String> list = new ArrayList<>();
有关更多信息,请参见此处。Oracle文档-集合
列表是一个接口。您不能使用List对其进行初始化。
List<String> supplierNames = new ArrayList<String>();
这些是List实施的一些类,
ArrayList, LinkedList, Vector
您可以根据需要使用任何一种。这些每个类都有其自己的功能。
以防万一,仍然有人在这个问题上徘徊。因为,我看到一个或两个新用户再次问相同的问题,然后每个人都说,不,亲爱的Prudence,除了此处给出的所有答案之外,我还想提供其他信息-是的,您实际上可以做,List list = new List(); 但是以编写所有接口方法的实现为代价。这个概念不只是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;
}
.....等等(无法编写所有方法。)
这是Anonymous类的示例。当有人指出时,它是正确的,不,您不能实例化一个接口,没错。但是你永远不能说,你不能写List list = new List(); 但是,显然您可以做到这一点,这很难说您做不到。
List
。而是声明一个没有名称的新类并实现List
,并在运行时创建新声明的类的新对象。
int[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]