tutorial que interfaz gui grafica español ejemplos componentes java generics warnings raw-types

java - que - ¿Es una buena práctica reemplazar Clase por Clase<? extiende Object> para evitar advertencias?



java swing tutorial pdf español (4)

En un montón de lugares en mi código, tengo algo como esto:

public Class mySpecialMethod() { return MySpecialClass.class; }

que causa la advertencia

La clase es un tipo sin procesar. Las referencias al tipo genérico Clase deben ser parametrizadas.

Pero, si reemplazo

Class

con

Class<? extends Object>

la advertencia desaparece

¿Está bien esta práctica simple, o podría causar problemas más adelante?


Dependiendo de lo que quiere lograr, puede ser aún más preciso:

public Class<MySpecialClass> mySpecialMethod() { return MySpecialClass.class; }


Es lo correcto para hacer solo si realmente no hay una clase de base común o interfaz que el objeto de clase debe representar.

¿También la Class<?> Es efectivamente lo mismo que la Class<? extends Object> Class<? extends Object> .


No es realmente un programador de Java aquí, pero leyó algunos buenos artículos sobre genéricos.

Sí, debe agregar algún comodín o el tipo exacto ( Class<MySpecialClass> ) para agregar seguridad. La razón es que Class es un genérico. Entonces, Class<Bar> y Class<Foo> son lo mismo después del borrado de su parámetro de tipo genérico. Todos se convierten en Class , el llamado tipo sin procesar. Esa eliminación ocurre al compilar. Un ejemplo para ilustrar esto donde el compilador lo ayuda con la conversión automática (se omite el manejo de excepciones por brevedad):

class Mine { } class Vara { public static void main(String... args) { { // works. translated to Mine m = (Mine) c.newInstance(); Class<Mine> c = Mine.class; Mine m = c.newInstance(); } { // doesn''t work. need a cast: Mine m = (Mine) c.newInstance(); Class c = Mine.class; // also Class<?> or Class<? extends Object> Object o = c.newInstance(); // but this works. pointing to a Mine Mine m = (Mine) c.newInstance(); // needs a manual cast } } }

Al decir Class<?> (Y la Class<? extends Object> equivalente Class<? extends Object> ), le dice al compilador que realmente quería una Clase cuyo T es Objeto, y que no utilizó accidentalmente el tipo sin procesar. Pero no agregará ningún molde de conveniencia. Todo lo que hacen los genéricos es insertar moldes automáticos para tirar desde el Object al tipo de destino. Los genéricos son los mismos ya sea que se usen con el tipo U o con el tipo T en tiempo de ejecución por razones de compatibilidad con las versiones anteriores de Java.