Questa è emersa come una domanda che ho posto di recente in un'intervista come qualcosa che il candidato desiderava vedere aggiunto al linguaggio Java. È comunemente identificato come un dolore il fatto che Java non abbia reificato i generici ma, se spinto, il candidato non poteva effettivamente dirmi il tipo di cose che avrebbe potuto ottenere se fossero lì.
Ovviamente poiché i tipi grezzi sono consentiti in Java (e i controlli non sicuri), è possibile sovvertire i generici e finire con un List<Integer>
che (ad esempio) contiene effettivamente String
s. Questo chiaramente potrebbe essere reso impossibile se le informazioni sul tipo fossero reificate; ma dev'esserci di più !
Le persone potrebbero pubblicare esempi di cose che vorrebbero davvero fare , se fossero disponibili farmaci generici reificati? Voglio dire, ovviamente potresti ottenere il tipo di a List
in fase di esecuzione, ma cosa faresti con esso?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDIT : Un rapido aggiornamento a questo dato che le risposte sembrano principalmente essere preoccupate per la necessità di passare a Class
come parametro (ad esempio EnumSet.noneOf(TimeUnit.class)
). Stavo cercando qualcosa di simile a dove questo non è possibile . Per esempio:
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()
dovrebbe ignorare la parametrizzazione, ma defineClass()
non potrebbe). E come sappiamo, The Powers That Be mantengono la compatibilità con le versioni precedenti di primaria importanza.