Những câu trả lời ở trên khá nhiều giải quyết câu hỏi của bạn, nhưng nếu bạn muốn có một ví dụ cụ thể của một trường hợp suy luận kiểu generic Java của thất bại và expli citly nêu nó theo cách này tiết kiệm trong ngày, hãy xem xét các định nghĩa lớp sau đây:
public class A { }
public class B extends A { }
public class C extends A { }
Sau đó, đoạn mã sau chỉ hoạt động tốt (ví dụ, suy luận kiểu Java thành công):
List<Class<? extends A>> list = ImmutableList.of(B.class, C.class);
Nhưng sau , không biên dịch được:
List<Class<? extends A>> list = ImmutableList.of(B.class);
Đúng vậy; lạ đủ, bởi loại bỏ một tham số, chúng ta nhầm lẫn giữa hệ thống kiểu suy luận, kể từ khi 'hậu duệ chung gần' của B.class
và C.class
là A.class
, nhưng đối với B.class
bởi chính nó, nó chỉ là B.class
, mà (do thiếu hiệp phương sai trong Generics Java) không khớp với List<Class<? extends A>>
. Trong trường hợp này, bạn không có lựa chọn nào khác để sử dụng:
List<Class<? extends A>> list = ImmutableList.<Class<? extends A>>of(B.class);
Kể từ B
không thực sự mở rộng A
, đây biên dịch (và chạy) tốt.
Tôi hy vọng cuộc biểu tình này nhấn mạnh tính hữu dụng của nhà điều hành.
Nguồn
2011-01-29 03:05:41
Vì sự tò mò của riêng tôi - nó có cần phải được khai báo rõ ràng vì các phương pháp đó là tĩnh không? – christophmccann
@Christopher: no. Nó hoạt động cả trong các phương thức tĩnh và không tĩnh. –
Nó cần phải được khai báo rõ ràng vì nó tĩnh, vì vậy không có hàm tạo nào đã sửa các đối số kiểu Generic và vì các đối số kiểu chung không thể được suy ra từ danh sách tham số. –