Guarda il caso estremo. Diciamo IFace
è acutally Object
, il codice sia poi così:
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);
}
Così si stanno mettendo a class
di extends Object
nella vostra Map
(in modo che qualsiasi class
).
Tuttavia, quando si chiama getThing
si esegue una trasmissione implicita sul tipo desiderato. Dovrebbe essere abbastanza ovvio che posso chiamare lo getThing
con qualsiasi class
e tenterò ciecamente di lanciarci su di esso.
Nell'esempio precedente sto inserendo alcune cose nel mio Map
e quindi nel tentativo di recuperarle tutte come Calendar
s.
fonte
2013-08-11 13:49:25
Rispondere alla mia domanda: No, non è perché posso avere due DIFFERENT classi 'ClassA' e' ClassB' che implementano entrambi 'IFace' in' faces'. A runtime 'T' potrebbe essere' ClassA' o 'ClassB'. – Cheetah
Speciali come sono molto interessato a un problema simile –
Perché i generici sono qui? Se stai solo riferendo le cose come 'IFace', allora non hai bisogno dei generici/casting –