Questo è uno dei principali buchi nei generici di Java, gli array sono covariante , il che significa che una serie di tipi Foo[]
è una sottoclasse di Object[]
e ParentOfFoo[]
. Contrasta con List<Foo>
che non ha questo comportamento.
Questo era importante quando Java non aveva generici (fino a Java 5) perché altrimenti, qualcosa come una generica funzione di ordinamento era semplicemente impossibile.
Tuttavia ha questo difficile problema che gli array vogliono sapere di che tipo sono in fase di runtime . Tuttavia i generici in Java si basano sulla cancellazione dei tipi. Queste due cose non si adattano affatto e questo è il nostro problema.
Quindi, in breve, in Java 1, gli array covarianti riempivano parzialmente il buco creato da una mancanza di generici. Tuttavia, quando hanno cercato di riempire correttamente questo buco, la compatibilità all'indietro ha significato che gli array erano praticamente impossibili da implementare.
In effetti, il tizio che ha creato il framework per i generici, Martin Odersky, ha parlato di questo qui durante un'intervista sul perché ha fatto Scala. (Molto affascinante se sei interessato alla storia di Scala)