Provo a immergermi profondamente in Java Generics e mi sono imbattuto in un problema descritto dal seguente codice di esempio.Java Generics - richiamo di metodi specifici da quelli generici
public static void test(Object o) {
System.out.println("Hello Object!");
}
public static void test(Integer i) {
System.out.println("Hello Integer!");
}
public static <T> void test(Collection<T> col) {
for (T item : col) {
System.out.println(item.getClass().getSimpleName());
test(item);
}
}
public static void main (String[] args) throws java.lang.Exception
{
Collection<Integer> ints = new ArrayList<>();
ints.add(1);
test(ints);
}
L'uscita del campione è
Integer
Hello Object!
Tutti i tipi sono ovviamente noti al momento della compilazione. Per quanto ho capito, Java contiene solo una singola copia compilata di ciascun metodo (a differenza di C++) e poiché non vengono forniti altri vincoli sul parametro T, è costretto a chiamare l'implementazione generica dell'oggetto.
La mia domanda è - esiste un modo per chiamare il metodo "Hello Integer" per i numeri interi senza sovraccaricare il metodo di prova per Collection<Integer>
e senza utilizzare il controllo del tipo di runtime?
Leggere "cancellazione tipo". – bmargulies
Grazie, ho familiarità con questo concetto e ho pensato che questo non fosse possibile per la ragione che ho dato nell'OP. Ma è troppo facile dire semplicemente "non è possibile" - se lo fosse, potrei imparare qualcosa di nuovo. – Danstahr