2014-09-05 20 views

Trả lời

7

Nó được mô tả here. Khả năng tương thích Supertype chỉ hoạt động ở cấp độ 'bên ngoài', nhưng không phải là 'bên trong' trên các thông số loại. Nó không trực quan, nhưng đó là cách nó hoạt động ... Ngoài ra, List là một loại thô, và nó hoạt động hơi khác so với List<Object> - được mô tả here.

3
List<List> 

là ngầm

List<List<Object>>

mà không phải là một phụ huynh của

List<List<String>> 

lý do tại sao nó thành công trong trường hợp thứ nhất là vì suy luận kiểu. Trình biên dịch về cơ bản sẽ kiểm tra loại là cần thiết cho sự biểu hiện có ý nghĩa và nó sẽ tạo ra

List<List<String>> a = b; 

Trong trường hợp thứ hai nó sẽ mặc định

List<List<Object>> a = b // which does not compile 
+0

Tôi hiểu điều đó, nhưng tại sao dòng thứ hai không cung cấp lỗi thời gian biên dịch vì nó có thể dẫn đến các lỗi thời gian chạy giống như dòng thứ 3? –

+0

Đó chính là lý do tại sao bạn nên sử dụng generics hơn các loại thô. Mã chung đảm bảo cho bạn loại an toàn trong trường hợp này, mã thô không. – Seb

3

Viết

List b = a; 

Không liên quan đến Generics. Nó định nghĩa một kiểu List thô có tên b mà có thể lấy bất kỳ đối tượng nào như là phần tử của nó.

Đừng so sánh nó với

List<List> c = a; 

vì nó liên quan đến Generics và đó là lý do trình biên dịch sẽ thực thi loại tương thích kiểm tra ở đây.

+0

Có, nhưng nếu thêm mã, chúng ta sẽ gọi b.add (new Object()); nó sẽ ném lỗi thời gian chạy vì chúng ta về cơ bản sẽ làm a.add (new Object()); Câu hỏi của tôi bây giờ là tại sao dòng thứ 3 ngăn chặn các lỗi ngẫu nhiên bằng cách đưa ra lỗi trong thời gian biên dịch, trong khi lỗi thứ hai không phải là –

+0

Lỗi thời gian chạy đó không liên quan đến việc kiểm tra khả năng tương thích kiểu của chúng tôi. –

+0

Tôi nghĩ rằng bình luận của bạn đã được trả lời trong câu trả lời của tôi. –

2

Câu trả lời ngắn gọn: vì danh sách c của bạn chứa danh sách có tất cả các loại đối tượng.
Ví dụ: bạn cũng có thể thêm Integer đối tượng.
a danh sách chỉ có thể chứa String đối tượng.

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