我无法按以下代码初始化List:
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>
?
答案 0 :(得分:670)
如果您检查List
Interface List<E>
,则会注意到:
interface
成为new List()
意味着无法实例化(无法class
)。
如果您检查该链接,则会找到一些List
来实施AbstractList
:
所有已知的实施类:
AbstractSequentialList
,ArrayList
,AttributeList
,CopyOnWriteArrayList
,LinkedList
,RoleList
,RoleUnresolvedList
,Stack
,Vector
,List<String> supplierNames1 = new ArrayList<String>(); List<String> supplierNames2 = new LinkedList<String>(); List<String> supplierNames3 = new Vector<String>();
可以实例化这些。使用他们的链接了解更多关于他们的信息,I.E:了解哪个更适合您的需求。
最常用的3种可能是:
Arrays
加成:
您还可以使用class
List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));
以更简单的方式使用值对其进行实例化,如下所示:
fixed-size
但请注意,您不能在该列表中添加更多元素,因为它是{{1}}。
答案 1 :(得分:79)
无法实例化接口,但实现很少:
<强> 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 强>
List<String> list = List.of("one", "two", "three");
另外,其他库提供了很多其他方法,例如 Guava 。
List<String> list = Lists.newArrayList("one", "two", "three");
答案 2 :(得分:36)
List是一个接口,你不能实例化一个接口,因为接口是一个约定,你的类应该有哪些方法。为了实例化,您需要该接口的一些实现(实现)。使用非常流行的List接口实现尝试以下代码:
List<String> supplierNames = new ArrayList<String>();
或
List<String> supplierNames = new LinkedList<String>();
答案 3 :(得分:13)
您需要使用ArrayList<String>
等。
List<String>
是一个界面。
使用此:
import java.util.ArrayList;
...
List<String> supplierNames = new ArrayList<String>();
答案 4 :(得分:11)
List是一个接口,您无法初始化接口。而是实例化一个实现类。
像:
List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();
答案 5 :(得分:9)
在大多数情况下,您需要简单的ArrayList
- List
在JDK第7版之前
List<String> list = new ArrayList<String>();
JDK 7及更高版本,您可以使用菱形运算符
List<String> list = new ArrayList<>();
此处记录了更多信息Oracle documentation - Collections
答案 6 :(得分:8)
List只是一个接口,是一些通用列表的定义。您需要提供此列表界面的实现。最常见的两种是:
ArrayList - 在数组上实现的列表
List<String> supplierNames = new ArrayList<String>();
LinkedList - 实现类似互连元素链的列表
List<String> supplierNames = new LinkedList<String>();
答案 7 :(得分:6)
取决于您要使用的List类型,例如
List<String> supplierNames = new ArrayList<String>();
应该让你去。
List是接口,ArrayList是List接口的一个实现。通过阅读JavaDocs of the List interface可以找到更多符合您需求的实现。
答案 8 :(得分:6)
如果您只想创建一个只包含一个对象的不可变 List<T>
,则可以使用此API:
List<String> oneObjectList = Collections.singletonList("theOnlyObject”);
更多信息:docs
答案 9 :(得分:5)
列表是一个接口。你不能使用List来初始化它。
List<String> supplierNames = new ArrayList<String>();
这些是List的一些要求的类,
ArrayList, LinkedList, Vector
您可以根据自己的要求使用其中任何一项。这些每个类都有自己的特色。
答案 10 :(得分: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(); 但是,显然你可以做到这一点而且这是一个很难的声明,可以让你可以&#39; 。
答案 11 :(得分:0)
我们创建了soyuz-to来简化1个问题:如何将X
转换为Y
(例如,将String
转换为Integer
)。构造对象也是一种转换,因此它具有构造Map
,List
,Set
的简单功能:
import io.thedocs.soyuz.to;
List<String> names = to.list("John", "Fedor");
请检查它-它还有很多其他有用的功能
答案 12 :(得分:0)
代替:
List<String> supplierNames = new List<String>();
如果您使用的是最新的 JDK,请写下这个:
List<String> supplierNames = new ArrayList<>();
这是初始化列表的正确方法。