Về mặt kỹ thuật, Java có kiểu suy luận khi sử dụng generic. Với một phương pháp chung chung như
public <T> T foo(T t) {
return t;
}
Trình biên dịch sẽ phân tích và hiểu rằng khi bạn viết
// String
foo("bar");
// Integer
foo(new Integer(42));
Một chuỗi sẽ được trả về cho cuộc gọi đầu tiên và một số nguyên cho cuộc gọi thứ hai dựa trên những gì được đưa vào làm đối số. Bạn sẽ nhận được kết quả kiểm tra thời gian biên dịch thích hợp. Ngoài ra, trong Java 7, người ta có thể nhận được một số loại suy luận bổ sung khi khởi tạo các tổng quát như vậy
Map<String, String> foo = new HashMap<>();
Java đủ tử tế để điền vào dấu ngoặc góc trống cho chúng tôi. Bây giờ tại sao Java không hỗ trợ kiểu suy luận như là một phần của phép gán biến? Tại một thời điểm, đã có một RFE cho kiểu suy luận trong các khai báo biến, nhưng điều này đã bị đóng là "Sẽ không sửa" bởi vì
Con người được hưởng lợi từ sự dư thừa của khai báo loại theo hai cách. Đầu tiên, loại dự phòng đóng vai trò là tài liệu có giá trị - người đọc không phải tìm kiếm khai báo getMap () để tìm ra loại nào trả về. Thứ hai, sự dư thừa cho phép lập trình viên khai báo loại dự định và do đó được hưởng lợi từ việc kiểm tra chéo được thực hiện bởi trình biên dịch.
Người đóng góp đã đóng cái này cũng lưu ý rằng nó chỉ cảm thấy "không giống java", mà tôi là người đồng ý. Sự dài dòng của Java có thể là cả một phước lành và một lời nguyền, nhưng nó làm cho ngôn ngữ trở thành như vậy.
Tất nhiên, RFE cụ thể đó không phải là kết thúc của cuộc trò chuyện đó. Trong Java 7, tính năng này một lần nữa được xem xét , với một số triển khai thử nghiệm được tạo ra, bao gồm một do chính James Gosling thực hiện. Một lần nữa, tính năng này cuối cùng đã bị bắn hạ.
Với việc phát hành Java 8, giờ đây chúng ta có được kiểu suy luận như là một phần của lambdas như sau:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Trình biên dịch Java có thể xem xét phương thức Collections#sort(List<T>, Comparator<? super T>)
và sau đó là giao diện Comparator#compare(T o1, T o2)
và xác định điều đó first
và second
nên là một String
chương trình cho phép người lập trình từ bỏ việc phải khôi phục kiểu trong biểu thức lambda.