Nhìn vào trường hợp cực đoan. Cho phép nói rằng IFace
là acutally Object
, mã của bạn sau đó trông như thế này:
static Map<String, Object> myMap = new HashMap<>();
public static void main(String[] args) throws Exception {
myMap.put("ONE", 1);
myMap.put("TWO", "TWO");
myMap.put("THREE", new Date());
final Calendar calendar1 = getThing("ONE");
final Calendar calendar2 = getThing("TWO");
final Calendar calendar3 = getThing("THREE");
}
public static <T> T getThing(String key) {
return (T) myMap.get(key);
}
Vì vậy, bạn đang đặt tại class
hơn extends Object
vào Map
của bạn (vì vậy bất kỳ class
).
Tuy nhiên, khi bạn gọi getThing
bạn đang thực hiện truyền ngầm đến loại mong muốn của mình. Rõ ràng là tôi cũng có thể gọi số getThing
với bất kỳ số class
nào và nó sẽ cố gắng truyền đến nó một cách mù quáng.
Trong ví dụ trên, tôi đang đặt một số thứ vào số Map
và sau đó cố gắng truy xuất chúng tất cả dưới dạng Calendar
s.
Nguồn
2013-08-11 13:49:25
Trả lời câu hỏi của riêng tôi: Không phải vì tôi có thể có hai lớp DIFFERENT 'ClassA' &' ClassB' mà cả hai thực thi 'IFace' trong' khuôn mặt'. Tại thời gian chạy 'T' có thể là' ClassA' hoặc 'ClassB'. – Cheetah
Được gắn dấu sao vì tôi rất quan tâm đến vấn đề tương tự –
Tại sao có các generics ở đây? Nếu bạn chỉ tham chiếu những thứ như 'IFace', thì bạn không cần các generics/casting –