2013-09-05 28 views
6

Lỗi:Tại sao không thể thêm Chuỗi để nhập vào Danh sách <?>?

The method add(capture#1-of ?) in the type List<capture#1-of ?> is not 
applicable for the arguments (String) 

Code:

List<?> to = new ArrayList<Object>(); 
to.add(new String("here")); 

Kể từ List<?> là một danh sách kiểu chung chung và do đó có thể là bất kỳ loại, thì tại sao nó không được chấp nhận String trong phương thức add?

+1

Vâng, và bình luận rằng không có mối quan hệ với các câu hỏi;) –

Trả lời

11

A List<?> là danh sách một số loại, chưa xác định. Vì vậy, bạn không thể thêm bất cứ điều gì để nó trừ rỗng mà không vi phạm các loại an toàn của danh sách:

List<Integer> intList = new ArrayList<>(); 
List<?> unknownTypeList = intList; 
unknownTypeList.add("hello"); // doesn't compile, now you should see why 
6

should a String not be acceptable ?

số <?> nghĩa là loại không rõ và trình biên dịch không thể chắc chắn rằng bất kỳ loại có thể chấp nhận để thêm (bao gồm Chuỗi)

0

Bạn có thể xem xét bất kỳ danh sách nào được xác định bằng ký tự đại diện là chỉ đọc. Tuy nhiên, có một số hoạt động không đọc mà bạn có thể thực hiện.

Từ the docs:

  • Bạn có thể thêm null.
  • Bạn có thể gọi rõ ràng.
  • Bạn có thể nhận trình lặp và gọi loại bỏ.
  • Bạn có thể chụp ký tự đại diện và viết các phần tử bạn đã đọc từ danh sách.
1

Theo wildcards, the question mark (?), called the wildcard, represents an unknown type và không phải là một kiểu generic, kể từ khi một loại unknown của trình biên dịch có thể không chấp nhận String trong trường hợp của bạn.

2

Bạn có thể chỉ định một thấp hơn ràng buộc:

List<? super Object> to = new ArrayList<Object>(); 
to.add(new String("here")); // This compiles 

Bây giờ trình biên dịch chắc chắn rằng danh sách này có thể chứa bất kỳ đối tượng

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