Considere este código Java:
package test;
public class Genric<E>
{
public Genric(E c){
System.out.println(c.getClass().getName());
}
public static void main(String[] args) {
new Genric<Integer[]>(new Integer[]{1,2});
}
}
Para su primer caso:
List< ? extends Integer[] > l;
Cuando haces algo como esto List< ? extends Integer[] > l;
entonces el compilador de Java lo ve como una List< ? extends Object> l;
y lo traduce en consecuencia . Entonces esta es la razón por la cual no obtienes ningún error.
El byte-código generado es el siguiente:
.
.
.
20: aastore
21: invokespecial #52; //Method "<init>":(Ljava/lang/Object;)V
24: return
.
.
Pedido el número de línea . Aunque, he pasado una matriz de java.lang.Integer
; internamente se traduce al java.lang.Object
.
Para su segundo caso:
class MyClass< T extends Integer[] > { } // ERROR!
De acuerdo con la especificación del lenguaje Java:
TypeParameter:
TypeVariable TypeBoundopt
TypeBound:
extends ClassOrInterfaceType AdditionalBoundListopt
.
.
Como se puede ver el la cota consiste exclusivamente de clase o una interfaz (ni siquiera los tipos primitivos) Entonces cuando haces algo como esto class MyClass< T extends Integer[] > { }
entonces Integer[]
no califica como una clase o interfaz.
Según mi comprensión de Java Spec, esto se hizo para resolver todos los escenarios como
class MyClass< T extends Integer[] >
class MyClass< T extends Integer[][] >
- ..
class MyClass< T extends Integer[][]...[] >
Debido a que todos ellos pueden ser representados como java.lang.Object
y cuando pasan como parámetro, como en el ejemplo
public Genric(E c){
System.out.println(c.getClass().getName());
}
como 'c' recuerda su tipo verdadero.
Espero que esto ayude.
Es extraño. El JLS establece claramente que solo puede usar clases o interfaces en las variables de tipo pero no proporciona ninguna explicación. – biziclop
solo para hacer "like-comparisons": "List Extends Integer []> k1;" está permitido, pero "List k2;" no es. ¡Pero no pude encontrar nada excepto null para agregar a la lista! Eclipse dice que k1.get (0) devuelve tipo Integer [], pero no pude agregar uno. –