Chữ ký được đề xuất của bạn có thể hoạt động trong Java-8. Tuy nhiên trong các phiên bản Java trước đây, suy luận kiểu không quá thông minh. Hãy xem xét rằng bạn có List<java.sql.Date>
. Lưu ý rằng java.sql.Date
kéo dài java.util.Date
triển khai Comparable<java.util.Date>
. Khi bạn biên soạn
List<java.sql.Date> list = new ArrayList<>();
Collections.sort(list);
Nó hoạt động hoàn hảo trong Java-7. Tại đây, T
được phỏng đoán là java.sql.Date
thực tế là Comparable<java.util.Date>
là Comparable<? super java.sql.Date>
. Tuy nhiên, hãy thử chữ ký của bạn:
public static <T extends Comparable<T>> void sort(List<? extends T> list) {}
List<java.sql.Date> list = new ArrayList<>();
sort(list);
Ở đây T
nên được suy ra là java.util.Date
. Tuy nhiên, đặc tả Java 7 không cho phép suy luận như vậy. Do đó, mã này có thể được biên dịch bằng Java-8, nhưng không thành công khi được biên dịch theo Java-7:
Main.java:14: error: method sort in class Main cannot be applied to given types;
sort(list);
^
required: List<? extends T>
found: List<Date>
reason: inferred type does not conform to declared bound(s)
inferred: Date
bound(s): Comparable<Date>
where T is a type-variable:
T extends Comparable<T> declared in method <T>sort(List<? extends T>)
1 error
Suy luận kiểu được cải thiện rất nhiều trong Java-8. Riêng biệt JLS chapter 18 là dành riêng cho nó bây giờ, trong khi trong Java-7 các quy tắc were đơn giản hơn nhiều.
Nguồn
2016-03-01 05:31:08
Nhưng làm thế nào để> T max (Bộ sưu tập extends T> c) hoạt động tốt ... đây có phải là một vấn đề suy luận không? –
prvn
@prvn, ở đây bạn có 'So sánh super T>' thay vì 'So sánh' như trong chữ ký được đề xuất của bạn. '> void sort (Danh sách extends T> list)' cũng sẽ hoạt động, nhưng thêm '? mở rộng T' là hoàn toàn không cần thiết ở đây, trong khi hợp lý trong phương thức 'max' (như' max' trả về giá trị). –
Có một điểm khác. Khi bạn có loại ký tự đại diện như danh sách 'Danh sách extends T>' bạn không thể thực hiện 'list.set (index, list.get (anotherIndex))' bên trong phương thức, do cách các loại ký tự đại diện hoạt động. Điều này có thể được phá vỡ với một phương pháp trợ giúp nội bộ bắt giữ '? mở rộng T' thành một biến kiểu khác (hoặc bằng cách sử dụng các hoạt động không được kiểm tra như các triển khai bên trong thường làm), nhưng vẫn còn, một kiểu không có ký tự đại diện sẽ rõ ràng hơn cho một danh sách sẽ được sửa đổi. – Holger