Spójrz na skrajny przypadek. Powiedzmy IFace
jest acutally Object
, następnie kod wygląda następująco:
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);
}
Więc stawiamy na class
niż extends Object
do swojej Map
(SO żadnego class
).
Ale kiedy zadzwonisz pod numer getThing
, wykonujesz niejawne rzutowanie na pożądany typ. Powinno być całkiem oczywiste, że mogę zadzwonić pod numer getThing
z dowolnym numerem class
i będzie on na ślepo próbował go rzucić.
W powyższym przykładzie umieszczam pewne rzeczy w moim Map
, a następnie próbuję pobrać je wszystkie jako Calendar
s.
Odpowiadając na moje własne pytanie: Nie, to nie dlatego, że mogę mieć dwie RÓŻNE klasy "ClassA' &" ClassB' które implementują 'IFace' w' faces'. W środowisku wykonawczym 'T' może być' ClassA' lub 'ClassB'. – Cheetah
Znana gwiazdka, ponieważ jestem bardzo zainteresowany podobnym problemem –
Dlaczego te generyczne są tutaj? Jeśli odwołujesz się do rzeczy typu "IFace", to nie potrzebujesz generycznych/castingowych –