2013-06-27 47 views
8

Từ this Oracle Java hướng dẫn:ký tự đại diện Chụp trong Java Generics

Ví dụ WildcardError tạo ra một lỗi chụp khi biên soạn:

public class WildcardError { 

    void foo(List<?> i) { 
     i.set(0, i.get(0)); 
    } 
} 

Sau khi trình diễn lỗi này, họ giải quyết vấn đề bằng cách sử dụng phương thức trợ giúp:

public class WildcardFixed { 
    void foo(List<?> i) { 
     fooHelper(i); 
    } 

    // Helper method created so that the wildcard can be captured 
    // through type inference. 
    private <T> void fooHelper(List<T> l) { 
     l.set(0, l.get(0)); 
    } 
} 

Đầu tiên, thứ ey nói rằng các tham số danh sách đầu vào (i) được xem như một Object:

Trong ví dụ này, trình biên dịch xử lý các thông số đầu vào i như là kiểu Object.

Tại sao sau đó i.get(0) không trả lại Object? nếu nó đã được thông qua như vậy?

Ngoài ra, điểm sử dụng <?> là gì khi bạn phải sử dụng phương thức trợ giúp bằng cách sử dụng <T>. Sẽ không tốt hơn khi sử dụng trực tiếp T có thể được suy ra?

+0

Đây là những gì Eclipse cung cấp cho tôi: 'Tập phương thức (int, capture # 1-of?) Trong loại List Không áp dụng cho các đối số (int, capture # 2-of ?) 'Âm thanh thậm chí còn vô lý hơn. –

+0

Tôi vừa viết một [câu trả lời] (http://stackoverflow.com/questions/30797805/understanding-a-captured-type-in-java/30798066#30798066) giải thích việc chụp lấy ký tự đại diện cho một câu hỏi khác. Thông tin đó dường như có liên quan cho câu hỏi này. – Lii

Trả lời

4

List<?> không có nghĩa là danh sách đối tượng thuộc loại không xác định, không giống như List<Object>.

Vì chúng tôi không biết loại phần tử trong kết quả danh sách của i.get(0) được Java coi là Object và bạn không thể thêm Object vào List<?>. Trong trường hợp Java của bạn có thể thông minh hơn, nhưng trong mã phức tạp hơn với các ký tự đại diện <?> thì thật dễ dàng để làm cho nó không an toàn.

+0

Theo tôi nhớ trường hợp này được giải thích chi tiết trong "Java hiệu quả" của Joshua Bloch –

+0

** Danh sách ** tương đương với ** Danh sách ** – Raf

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