2014-12-07 16 views
5

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?

+0

Leggere "cancellazione tipo". – bmargulies

+0

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

risposta

3

Non è possibile. A causa del tipo di cancellazione del tipo Collection<T> verrà risolto il tipo Collection<Object>. Erasure of Generic Methods

1

No, non puoi fare quello che chiedi, per le ragioni che hai dato. La cancellazione del tipo indica che il sovraccarico viene risolto una volta per tutte le variabili di tipo e deve essere risolto su Oggetto.