Este es uno de los principales agujeros en los genéricos de Java, las matrices son covariantes , lo que significa que una matriz de tipo Foo[]
es una subclase de Object[]
y ParentOfFoo[]
. Contrasta esto con List<Foo>
lo que no tiene este comportamiento.
Esto era importante cuando Java no tenía genéricos (hasta Java 5) porque de lo contrario, algo así como una función de clasificación genérica era simplemente imposible.
Sin embargo, tiene este problema complicado que a las matrices les gusta saber de qué tipo son en tiempo de ejecución . Sin embargo, los genéricos en Java se basan en el borrado de tipo. Estas dos cosas no encajan bien y ahí es donde obtenemos nuestro problema.
Entonces, en resumen, en Java 1, las matrices covariantes llenaron parcialmente el vacío que creó la falta de genéricos. Sin embargo, cuando intentaron llenar adecuadamente este agujero, la compatibilidad con versiones anteriores significaba que las matrices eran bastante imposibles de implementar.
De hecho, el tipo que realmente creó el marco para los genéricos, Martin Odersky, habló sobre esto aquí durante una entrevista sobre por qué hizo Scala. (Bastante fascinante si te interesa la historia de Scala)