¿Es una buena práctica reemplazar Class con Class<?¿Extiende Objeto> para evitar advertencias?

StackOverflow https://stackoverflow.com/questions/370601

Pregunta

En varios lugares de mi código, tengo algo como esto:

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

lo que provoca la advertencia

La clase es un tipo crudo.Referencias a La clase de tipo genérico debe ser Parametrizados.

Pero si reemplazo

Class

con

Class<? extends Object>

la advertencia desaparece.

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

¿Fue útil?

Solución

Es la cosa correcta de hacer sólo si realmente no hay clase base común o interfaz que la clase de objeto tiene que representar.

También Class<?> es efectivamente el mismo que Class<? extends Object>.

Otros consejos

Sí, es totalmente correcto.

Es un requisito que especifique el tipo. Y si no se puede, hay que especificar el comodín.

Más información: de Java Language Specification: Tipos parametrizados

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

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

Realmente no soy un programador de Java aquí, pero leí algunos buenos artículos sobre genéricos.

Sí, deberías agregar algún comodín o el tipo exacto (Class<MySpecialClass>) para añadir seguridad.La razón es que Class es genérica.Entonces, Class<Bar> y Class<Foo> son los mismos después de borrar su parámetro de tipo genérico.todos ellos se convierten Class, el llamado tipo crudo.Ese borrado ocurre al compilar.Un ejemplo para ilustrar esto donde el compilador le ayuda con la conversión automática (el manejo de excepciones se omite 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
        }
    }
}

Dicho Class<?> (y el equivalente Class<? extends Object>), le dices al compilador que realmente querías una Clase cuya T es Objeto, y no usé accidentalmente el tipo sin formato.Pero no agregará ningún elenco de conveniencia.Todo lo que hacen los genéricos es insertar conversiones automáticas por usted, emitir desde 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 versiones anteriores de Java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top