2012-08-11 11 views
8

Class<? extends Integer> compilará bien, pero Integer es un tipo final, por lo que no tiene sentido usarlo como un límite superior (nada lo hará extend).Comodín con límite superior final

Si intenta utilizar un tipo final como un límite superior para un parámetro de tipo, obtendrá una advertencia del compilador:

El tipo de parámetro T no debe ser limitada por el tipo Integer final. tipos finales no se pueden ampliar

Por qué sería el uso de un tipo final como un límite superior para un comodín ser perfectamente bien, pero lanzar una advertencia para un parámetro de tipo? ¿Por qué Java incluso permite que los comodines estén delimitados por un tipo superior final?

Respuesta

5

Class<Integer> no es tan permisivo para la asignación como Class<? extends Integer>.

Por ejemplo, este compila:

Class<? extends Number> numberClass = Integer.class; 
Class<? extends Integer> integerClass = numberClass.asSubclass(Integer.class); 

Esto no es así:

Class<? extends Number> numberClass = Integer.class; 
Class<Integer> integerClass = numberClass.asSubclass(Integer.class); 

mí mismo, no pude conseguir una advertencia del compilador y cuando (tal vez usted podría ofrecer un ejemplo y detalles sobre tu compilador?).

+1

Me parece que el compilador podría darse cuenta de que la 'Clase 'devuelto desde su segundo ejemplo es compatible con' Clase 'porque' Integer' es final. Pero supongo que eso agregaría más complejidad al compilador que su valor. Tal vez la advertencia es específica de Eclipse: Eclipse Juno con JDT 3.8.0. – Jeffrey