Đây là một câu hỏi mà tôi đã hỏi trong một cuộc phỏng vấn gần đây như một thứ mà ứng viên muốn thấy được thêm vào ngôn ngữ Java. Nó thường được xác định là một nỗi đau mà Java không có các generic được sửa đổi lại, nhưng khi được thúc đẩy, ứng viên không thể thực sự cho tôi biết loại thứ mà anh ta có thể đạt được khi họ ở đó.
Rõ ràng là vì các kiểu thô được cho phép trong Java (và các kiểm tra không an toàn), nên có thể lật ngược các loại chung và kết thúc bằng một loại List<Integer>
(ví dụ) thực sự chứaString
s. Điều này rõ ràng có thể được thực hiện không thể được sửa đổi thông tin loại; nhưng phải có nhiều hơn thế này !
Mọi người có thể đăng ví dụ về những điều mà họ thực sự muốn làm , có sẵn các chỉ số chung được sửa đổi không? Ý tôi là, rõ ràng bạn có thể nhận được loại a List
trong thời gian chạy - nhưng bạn sẽ làm gì với nó?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
CHỈNH SỬA : Cập nhật nhanh điều này vì các câu trả lời dường như chủ yếu quan tâm đến nhu cầu chuyển vào một Class
dưới dạng tham số (ví dụ EnumSet.noneOf(TimeUnit.class)
). Tôi đã tìm kiếm nhiều hơn cho một cái gì đó dọc theo ranh giới mà điều này không thể thực hiện được . Ví dụ:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
sẽ phải bỏ qua tham số hóa, nhưng defineClass()
không thể). Và như chúng ta đã biết, The Powers That Be có khả năng tương thích ngược là điều tối quan trọng.