2012-11-15 73 views
269

我不能初始化列表,如下面的代碼:如何在Java中初始化列表<String>對象?

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

我面臨以下錯誤:

Cannot instantiate the type List<String>

如何我可以實例List<String>

回答

531

如果檢查的互聯鏈實現列表 - 一個數組

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

LinkedList的實施列表APIList你會注意到它說:

Interface List<E> 

作爲interface意味着它不能實例化(沒有new List()是可能的)。

如果選中該鏈接,你會發現一些class ES實現List

All Known Implementing Classes:

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

那些可以被實例化。使用他們的鏈接瞭解更多關於他們的信息,I.E:瞭解哪些更適合您的需求。

3點最常用的可能是:

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

獎勵:
您還可以使用值初始化它,在一個更簡單的方法,使用Arraysclass,如下:

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

但是請注意,您不允許在該列表中添加更多元素,因爲它是fixed-size

+1

Arrays.asList非常好,但是現在你應該已經注意到了,在'int [] a = {1,2,3};的System.out.println(Arrays.asList的(a)); // [[I @ 70cdd2]' –

+1

@ J.A.I.L。這不是發生了什麼事。這是一個元素的列表,其中一個元素是一個int數組。想要的行爲可能是三個元素1,2和3的列表。 –

+1

@ChristofferHammarström打印列表或數組時,可以使用java.util.Arrays.toString(array);所以這個特性已經給出了.. – Maxr1998

11

您需要使用ArrayList<String>等。

List<String>是一個接口。

使用此:

import java.util.ArrayList; 

... 

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

列表是一個接口,你不能初始化界面。實例化一個實現類。

像:

List<String> abc = new ArrayList<String>(); 
List<String> xyz = new LinkedList<String>(); 
33

列表是一個接口,你不能實例化一個接口,由於接口是一個約定,什麼方法應該有你的課。爲了實例化,您需要該接口的一些實現(實現)。試試下面的代碼與List接口的非常受歡迎的實現:

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

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

根據您要使用什麼樣的名單中,像

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

應該讓你去。

列表是接口,ArrayList是List接口的一個實現。通過閱讀JavaDocs of the List interface可以找到更適合您需求的更多實現。

5

列表是一個接口。你不能用List來初始化它。

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

這些都是一些名單impelemented類,

ArrayList, LinkedList, Vector 

你可以使用任何的這個按您的要求。這些每個類都有自己的特點。

+0

一些Discorage使用Vector [this](http://www.javapractices.com/topic/TopicAction.do?Id=65)和[here](http://stackoverflow.com/questions/1792134/ A-同事,說 - 不要使用-Java的util的矢量-了 - 爲什麼 - 不是)。由於線程問題 –

8

列表只是一個接口,一些通用列表的定義。你需要提供這個列表界面的實現。兩種最常見的有:

的ArrayList - 相同的元件

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

在大多數情況下,你想簡單ArrayList - 的List

實現JDK版本之前7

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

JDK 7,以後你可以使用鑽石操作

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

更多信息寫在這裏Oracle documentation - Collections

1

如果你只是想用它只有一個對象創建不變List<T>,你可以使用這個API:

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

更多信息:docs

3

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"); 

再加上有很多由像番石榴其他圖書館提供的其他方式。

0

爲了以防萬一,任何人仍然徘徊在這個問題。因爲,我看到一兩個新用戶再次詢問相同的問題,然後每個人都會問,不,你不能這樣做,親愛的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; 
     } 

.....等等(廣東話寫的所有方法。)

這是匿名類的一個實例。它的正確的時候有人說,不,你不能實例化一個接口,,這是正確的。但你永遠不能說,你可以寫List list = new List();但是,顯然你可以這樣做,這是一個艱難的聲明,使,你不能做