Este é um dos principais buracos nos genéricos de Java, matrizes são covariantes , o que significa que uma matriz de tipo Foo[]
é uma subclasse de Object[]
e ParentOfFoo[]
. Compare isso com o List<Foo>
que não tem esse comportamento.
Isso era importante quando o Java não possuía genéricos (até o Java 5) porque, caso contrário, algo como uma função de classificação genérica era simplesmente impossível.
No entanto, há um problema complicado que as matrizes gostam de saber que tipo são no tempo de execução . No entanto, os genéricos em Java são baseados no apagamento de tipo. Essas duas coisas não combinam bem e é aí que temos o nosso problema.
Portanto, em Java 1, as matrizes covariantes preencheram parcialmente o buraco que a falta de genéricos criou. No entanto, quando eles tentaram preencher adequadamente esse buraco, a compatibilidade com versões anteriores significou que as matrizes eram praticamente impossíveis de implementar.
De fato, o cara que realmente criou a estrutura para genéricos, Martin Odersky, falou sobre isso aqui durante uma entrevista sobre por que ele criou o Scala. (Muito fascinante se você estiver interessado na história de Scala)