我无法初始化List,如下面的代码所示:
List supplierNames = new List();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));
我面临以下错误:
Cannot instantiate the type List
如何实例化List?
如果您检查List的API,您会注意到它:
Interface List
作为interface意味着它不能被实例化(没有new List()是可能的)。
如果您检查该链接,您会发现一些class es实现List:
All Known Implementing Classes:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
那些可以实例化。使用他们的链接了解更多关于他们的信息,I.E:了解哪个更符合您的需求。
最常用的3种可能是:
List supplierNames1 = new ArrayList();
List supplierNames2 = new LinkedList();
List supplierNames3 = new Vector();
奖金:
您还可以使用Arrays class以更简单的方式使用值对其进行实例化,如下所示:
List supplierNames = Arrays.asList("sup1","sup2","sup3");
System.out.println(supplierNames.get(1));
但请注意,您不能向该列表添加更多元素,因为它是fixed-size。
Arrays.asList很棒但是你应该注意到现在无法做到像int[] a = {1,2,3}; System.out.println(Arrays.asList(a)); [[I@70cdd2]这样的情况
@监狱。多数民众赞成没有发生。这是一个元素的列表,其中一个元素是一个int数组。想要的行为可能是三个元素1,2和3的列表。
@Christoffer Hammarstrm打印一个列表或一个数组,你可以使用java.util.Arrays.toString(array);,所以这个功能已经给出..
@ Maxr1998我不知道你在说什么,我的意思是[I@70cdd2是一个整数数组的.toString(),而不是像List的内存地址。说过。
@Christopher Hammarstrm toString打印内存地址。
我的方法打印内容。
像这样和在这里使用Vector的一些减少使用。由于线程问题
如果您需要结果列表为ArrayList,请使用new ArrayList<>(Arrays.asList("sup1","sup2","sup3"))
我有一个方法返回List到List正常工作。有人知道这是怎么回事吗? ListtableList = getTableNames(sqlString);
无法实例化接口,但实现很少:
JDK2
List list = Arrays.asList("one","two","three");
JDK7
//diamond operator
List list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
JDK8
List list = Stream.of("one","two","three").collect(Collectors.toList());
JDK9
// creates immutable lists, so you can't modify such list
List 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 mutableList = new ArrayList<>(List.of("one","two","three"));
此外,还有许多其他库提供的其他方式,如番石榴。
List list = Lists.newArrayList("one","two","three");
List是一个接口,你不能实例化一个接口,因为接口是一个约定,你的类应该有哪些方法。为了实例化,您需要该接口的一些实现(实现)。使用非常流行的List接口实现尝试以下代码:
List supplierNames = new ArrayList();
要么
List supplierNames = new LinkedList();
您需要使用ArrayList等。
List是一个界面。
用这个:
import java.util.ArrayList;
...
List supplierNames = new ArrayList();
List是一个接口,您无法初始化接口。实际上实例化一个实现类。
喜欢:
List abc = new ArrayList();
List xyz = new LinkedList();
在大多数情况下,您需要简单的ArrayList - List的实现
在JDK第7版之前
List list = new ArrayList();
JDK 7及更高版本可以使用菱形运算符
List list = new ArrayList<>();
进一步的信息写在这里Oracle文档 - 集合
List只是一个接口,是一些通用列表的定义。您需要提供此列表界面的实现。最常见的两种是:
ArrayList - 在数组上实现的列表
List supplierNames = new ArrayList();
LinkedList - 实现类似互连元素链的列表
List supplierNames = new LinkedList();
如果您只想创建一个只包含一个对象的不可变List< T >,则可以使用此API:
List oneObjectList = Collections.singletonList("theOnlyObject");
更多信息:docs
取决于您要使用的List类型,类似于
List supplierNames = new ArrayList();
应该让你去。
List是接口,ArrayList是List接口的一个实现。通过阅读List接口的JavaDocs,可以找到更适合您需求的更多实现。
列表是一个接口。你不能使用List来初始化它。
List supplierNames = new ArrayList();
这些是列中的一些实例化的类,
您可以根据自己的要求使用其中任何一项。这些每个类都有自己的功能。
像这样和在这里使用Vector的一些减少使用。由于线程问题
以防万一,任何人仍然围绕这个问题挥之不去。因为,我看到一两个新用户再次提出同样的问题,然后每个人都在说,不,你不能这样做,亲爱的普律当丝,除了这里给出的所有答案,我想提供更多信息 -
是的你实际上可以做,List list = new List();
但是以编写接口的所有方法的实现为代价。
这个概念不仅仅是List list = new List();但
List list = new List(){
@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的新类,并在运行时创建新声明的类的新对象。
我们创建了soyuz-to来简化1个问题:如何将X转换为Y(例如String到Integer)。构造对象也是一种转换,因此它具有构造Map,List,Set的简单功能:
import io.thedocs.soyuz.to;
List names = to.list("John","Fedor");
请检查它 - 它有很多其他有用的功能