2012-03-30 7 views
15

Tôi muốn decare hai Danh sách: Đầu tiên là danh sách các số nguyên. Tôi quyết định nó là:Tại sao sự khác biệt trong việc khai báo Danh sách chung?

List<Integer> ints= Arrays.asList(1,2,3); 

Nó hoạt động tốt.

Thứ hai là danh sách Đối tượng. Tôi tuyên bố nó là:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

Nhưng nó sẽ gây ra lỗi trong nhật thực ngay sau khi tôi viết. Lỗi này là:

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

Thay vào đó nếu tôi viết

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

Nó hoạt động tốt.

Tôi không thể tìm ra lý do.

Trả lời

14

Nhìn vào this post on stackoverflow.

15.12.2.7 Suy luận Loại Arguments Dựa trên luận cứ thực tế

Một siêu kiểu chế T:> X ngụ ý rằng giải pháp là một trong những siêu kiểu của X. Do một số hạn chế như trên T, chúng ta có thể cắt nhau các tập hợp siêu kiểu được ngụ ý bởi mỗi ràng buộc, vì tham số loại phải là thành viên của tất cả chúng. Sau đó chúng tôi có thể chọn loại cụ thể nhất là ở ngã tư

Loại giao hạn chế nhất giữa String, DoubleInteger là cả giao diện ComparableSerializable. Vì vậy, khi bạn viết

Arrays.asList(1,2.13,"three"); 

Nó suy luận Timplements Comparable<?>, Serializable .Sau đó nó được như nếu bạn đang làm

List<Object> objs = new List<T extends Comparable<?>, Serializable> 

Rõ ràng, điều này là không được phép.
Mặt khác, khi bạn chỉ định Object một cách rõ ràng bằng

Arrays.<Object>asList(1,2.13,"three"); 

không suy luận được làm

+0

OK. Cảm ơn lời giải thích cực kỳ tốt. Đây sẽ là một quy tắc vàng để áp dụng trong trường hợp nhầm lẫn như vậy. –

2

Sử dụng các công trình này hoàn hảo

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

Output: [10, 20.32, thử nghiệm]

+3

Đó là tốt, nhưng lưu ý rằng như xa như trình biên dịch là có liên quan, 'Danh sách ' là * không * giống như 'Danh sách 'và OP có thể cần một' List ' – Bohemian

+1

-1 Như OP đã nói,' Mảng. asList (1,2,13, "ba") 'hoạt động tốt.Câu hỏi đặt ra là tại sao trình biên dịch không suy ra 'Object', không phải là cách hack một giải pháp. –