2012-11-15 27 views
269

tôi không thể khởi tạo một danh sách như trong đoạn mã sau:Cách khởi tạo Danh sách đối tượng <String> trong Java?

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

Tôi đối mặt với những lỗi sau:

Cannot instantiate the type List<String>

Làm thế nào tôi có thể nhanh chóng List<String>?

Trả lời

531

Nếu bạn đánh dấu vào API cho List bạn sẽ thấy thông báo cho biết:

Interface List<E> 

interface nghĩa là không thể khởi tạo được (không new List()).

Nếu bạn kiểm tra liên kết đó, bạn sẽ tìm thấy một số class es mà thực hiện List:

All Known Implementing Classes:

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

Những có thể được khởi tạo. Sử dụng liên kết của họ để biết thêm về họ, I.E: để biết cái nào phù hợp hơn với nhu cầu của bạn.

3 người dùng phổ biến nhất có lẽ là:

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

Bonus:
Bạn cũng có thể nhanh chóng nó với các giá trị, trong một cách dễ dàng hơn, bằng cách sử dụng Arraysclass, như sau:

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

Nhưng lưu ý rằng bạn không được phép thêm các yếu tố khác vào danh sách đó, vì đó là fixed-size.

+1

Arrays.asList là tuyệt vời nhưng như bạn cần phải nhận thấy bây giờ không làm những gì người ta mong đợi trong các trường hợp như 'int [] a = {1,2,3}; System.out.println (Arrays.asList (a)); // [[I @ 70cdd2] ' –

+1

@ J.A.I.L. Đó không phải là những gì đang xảy ra. Đó là danh sách của một phần tử, trong đó một phần tử là một mảng int.Hành vi mong muốn có lẽ là danh sách gồm ba phần tử 1, 2 và 3. –

+1

@Christoffer Hammarström để in một danh sách hoặc một mảng, bạn có thể sử dụng java.util.Arrays.toString (mảng) ;, do đó tính năng này đã được cung cấp .. – Maxr1998

11

Bạn sẽ cần phải sử dụng ArrayList<String> hoặc tương tự.

List<String> là một giao diện.

Sử dụng này:

import java.util.ArrayList; 

... 

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

Danh sách là một giao diện, và bạn không thể khởi tạo một giao diện. Khởi tạo một lớp thực hiện thay thế.

Giống như:

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

Danh sách là một Interface, bạn không thể khởi tạo một giao diện, bởi vì giao diện là một quy ước, những gì phương pháp này cần có các lớp học của bạn. Để khởi tạo, bạn cần một số thực hiện (triển khai) của giao diện đó. Hãy thử đoạn code dưới đây với việc triển khai rất phổ biến của giao diện liệt kê:

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

hoặc

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

Tùy thuộc vào loại Danh sách bạn muốn sử dụng, một cái gì đó giống như

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

sẽ giúp bạn có đang đi.

Danh sách là giao diện, ArrayList là một trong những triển khai thực hiện của giao diện Danh sách. Bạn có thể tìm thấy nhiều triển khai phù hợp hơn với nhu cầu của mình bằng cách đọc số JavaDocs of the List interface.

5

Danh sách là một Giao diện. Bạn không thể sử dụng Danh sách để khởi tạo nó.

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

Đây là những một số Danh sách impelemented lớp,

ArrayList, LinkedList, Vector 

Bạn có thể sử dụng bất kỳ này theo yêu cầu của bạn. Các lớp này có các tính năng riêng.

+0

Một số cách sử dụng bộ nhớ của Vector như [this] (http://www.javapractices.com/topic/TopicAction.do?Id=65) và [here] (http://stackoverflow.com/questions/1792134/ một đồng nghiệp-nói-không-sử dụng-java-util-vector-nữa-tại sao-không). Bởi vì các vấn đề luồng –

8

Danh sách chỉ là một giao diện, một định nghĩa về một số danh sách chung chung. Bạn cần cung cấp triển khai giao diện danh sách này.Hai phổ biến nhất là:

ArrayList - một danh sách thực hiện trên một mảng

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

LinkedList - một danh sách thực hiện giống như một chuỗi nối liền với nhau của các yếu tố

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

Trong hầu hết các trường hợp, bạn muốn đơn giản ArrayList - một thực hiện List

Trước khi phiên bản JDK 7

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

JDK 7 và sau đó bạn có thể sử dụng toán tử kim cương

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

thông tin tiếp theo được viết ở đây Oracle documentation - Collections

1

Nếu bạn chỉ muốn tạo một bất biếnList<T> với chỉ một đối tượng trong nó, bạn có thể sử dụng API này:

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

Thông tin thêm: 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"); 

Plus có rất nhiều cách khác được cung cấp bởi các thư viện khác như ổi.

0

Chỉ trong trường hợp, bất kỳ ai vẫn còn nán lại xung quanh câu hỏi này. Bởi vì, tôi thấy một hoặc hai người dùng mới lại hỏi cùng một câu hỏi và mọi người nói rằng, Không, bạn không thể làm điều đó, Kính gửi Prudence, Ngoài tất cả các câu trả lời được đưa ra ở đây, tôi muốn cung cấp Thông tin bổ sung - Có bạn thực sự có thể làm, Danh sách danh sách = danh sách mới(); Nhưng với chi phí viết thực hiện tất cả các phương thức của Giao diện. Khái niệm không đơn giản là List list = new List(); nhưng

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; 
     } 

..... và vân vân (Cant viết tất cả các phương pháp.)

Đây là một ví dụ về Anonymous lớp. Chính xác khi ai đó tuyên bố, Không, bạn không thể khởi tạo giao diện, và điều đó đúng. Nhưng bạn không bao giờ có thể nói, Bạn CANT viết danh sách List = new List(); nhưng, rõ ràng bạn có thể làm điều đó và đó là một tuyên bố khó khăn để thực hiện mà bạn không thể làm.

Các vấn đề liên quan