2013-08-07 17 views
26

Infine, ho sperimentato un po 'i generici. Sono venuto con questo pezzo di codice:Java: Sperimentare con i generici

public class Test { 

    static <T> void f(T x) { 
     x = (T) (Integer) 1234; 
     System.out.println(x); 
    } 

    public static void main(String[] args) { 
     f("a"); 
     f(1); 
     f('a'); 
     f(1.5); 
     f(new LinkedList<String>()); 
     f(new HashMap<String, String>()); 
    } 
} 

ho corso questo ed ho ottenuto questo output:

1234 
1234 
1234 
1234 
1234 
1234 

senza eccezioni! Come è possibile?

+0

Attenzione, ti stai allontanando pericolosamente da chiedere: "Perché i generici non funzionano come i modelli C++?" –

risposta

36

È a causa di type erasure (molto è stato scritto su questo, solo google per questo termine). Dopo la compilazione f al byte di codice del metodo potrebbe assomigliare a questo:

static void f(Object x) { 
    x = (Object) (Integer) 1234; 
    System.out.println(x); 
} 

Così System.out.println sarà solo chiamare il metodo toString sull'oggetto x - e nel tuo caso è Integer.toString().

+1

questa è una risposta stupenda :) –

3

A causa della cancellazione del tipo. Da Oracle's documentation:

Generics sono state introdotte per il linguaggio Java per fornire il tipo più stretta controlli in fase di compilazione e per supportare la programmazione generica. Per attuare farmaci generici, il compilatore Java si applica la cancellazione di tipo a:

  • Sostituire tutti i parametri di tipo in tipi generici con i loro limiti o oggetto se i parametri di tipo sono illimitati. Pertanto, il codice prodotto, , contiene solo classi, interfacce e metodi ordinari.

  • Inserire tipi di calchi se necessario per preservare la sicurezza del tipo.

  • Generare metodi bridge per preservare il polimorfismo in tipi generici estesi.

La cancellazione del tipo garantisce che non vengano create nuove classi per i tipi parametrizzati ; di conseguenza, i generici non comportano nessun sovraccarico di runtime.

+3

Quando copi le parole di una risorsa esterna, assicurati sempre di citare correttamente e collegare il testo originale. –