Perché i generici Java non possono essere in array?


Risposte:


20

Questo è uno dei principali buchi nei generici di Java, le matrici sono covarianti , il che significa che una matrice di tipo Foo[]è una sottoclasse di Object[]e ParentOfFoo[]. Contrastare ciò con il List<Foo>quale non ha questo comportamento.

Questo era importante quando Java non aveva generici (fino a Java 5) perché altrimenti, qualcosa come una funzione di ordinamento generico era semplicemente impossibile.

Tuttavia ha questo problema complicato che gli array amano sapere che tipo sono in fase di esecuzione . Tuttavia, i generici in Java si basano sulla cancellazione del tipo. Queste due cose non si adattano affatto bene ed è qui che otteniamo il nostro problema.

Quindi la parte più lunga e corta di essa è, in Java 1, array di covarianti riempì parzialmente il buco creato da una mancanza di generici. Tuttavia, quando hanno provato a riempire correttamente questo buco, la retrocompatibilità ha reso impossibile la realizzazione di array.

In effetti, il ragazzo che ha effettivamente creato la struttura per i generici, Martin Odersky, ne ha parlato qui durante un'intervista sul perché ha realizzato Scala. (Abbastanza affascinante se sei interessato alla storia di Scala)


3

C'è una ragione legata all'implementazione java di generici, generici in qualsiasi lingua o qualcosa di arbitrario?

In realtà, è in qualche modo arbitrario.

Il problema è che consente un buco nel sistema dei tipi, poiché ArrayList<T>[]può essere eseguito il cast Object[]e quindi è possibile inserire un ArrayList<U>array nell'array, dove U != T.

I progettisti Java hanno deciso di bloccare questo buco il più avidamente possibile, non permettendo new ArrayList<T>[N]affatto.

Tuttavia, potrebbe anche essere stato inserito non consentendo l'upgrade di array di generici (senza un avviso "non controllato").


Questa risposta è sottovalutata. Molto semplice e non usa il gergo in termini vaghi. Grazie mille.
Tung Nguyen,

Potresti voler spiegare perché questo è diverso dal caso in cui hai inserito Integerun Object[]che è in realtà unString[]
Caleth,

-3

perché l' array è covariante, ogni tipo è una sottoclasse dell'oggetto, quindi questo dà un errore in fase di esecuzione a causa dell'eccezione di cast. mentre il generico è invariante, quindi quando si basa sul tipo assicurati o sicuro per il tipo, quindi se il tipo non piace crea il tipo dà un errore del compilatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.