I generici di Java in realtà non cambiano la classe o l'oggetto sottostante, forniscono solo semantica di compilazione (principalmente) attorno ad essi.
viene trasmesso un ArrayList<Integer>
in un metodo in attesa di un ArrayList
(che può contenere qualsiasi cosa ), si sta bypassando la capacità del compilatore di fornire con la sicurezza che tipo.
Il Java Generics Tutorial spiega questo, e perché Java implementa generici in questo modo. This page, in particolare, si concentra su di esso:
Generics sono state introdotte per il linguaggio Java per fornire controlli di tipo più stretti al momento della compilazione e per supportare la programmazione generica. Per implementare i generici, il compilatore Java applica la cancellazione di tipo a:
- Sostituisci tutti i parametri di tipo in tipi generici con i relativi limiti o Oggetto se i parametri di tipo sono illimitati. Il codice prodotto, quindi, contiene solo classi, interfacce e metodi ordinari.
- Inserire tipi di cast, 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 tipi parametrizzati; di conseguenza, i generici non comportano nessun sovraccarico di runtime.
Quello che non dice è che questo permette anche il codice scritto con farmaci generici (come il vostro run
) di interagire con il codice scritto senza farmaci generici (come il vostro readList
), che è importante quando si aggiunge una caratteristica a una lingua ben consolidata con un'enorme base di libreria (come lo erano quando si aggiungevano i generici a Java).
fonte
2015-05-27 21:31:10
"Java", non "JAVA". – ace
1. Stai usando il tipo 'Raw' in' readList() '. 2. Leggi di "cancellazione dei tipi". –
Stai ** non ** recuperando un tipo di 'Lista'. Stai recuperando il tipo del ** primo elemento ** di 'List'. –