Pregunta ¿Cuál es la forma correcta de verificar el tipo de objeto para el objeto genérico?


Recibí un mensaje de advertencia en Object Casting mientras compilaba mi código. No tengo idea de cómo solucionarlo con mi conocimiento actual ... Digamos que tengo un objeto genérico MyGenericObj<T> Se extiende desde un objeto no genérico. MyObj

Aquí hay un código de ejemplo:

MyObj obj1 = new MyGenericObj<Integer>();
if (obj1 instanceof MyGenericObj) {
    //I was trying to check if it's instance of MyGenericObj<Integer>
    //but my IDE saying this is wrong syntax.... 
    MyGenericObj<Integer> obj2 = (MyGenericObj<Integer>) obj1;
    //This line of code will cause a warning message when compiling 
}

¿Podría por favor decirme cuál es la forma correcta de hacer esto?

Cualquier ayuda es apreciada.


5
2018-04-19 16:52


origen


Respuestas:


Porque borrar el tipo, No hay manera de hacer eso: MyGenericObj<Integer> es en realidad un MyGenericObj<Object> Detrás de la escena, independientemente de su tipo de parámetro.

Una forma de evitar esto sería añadir una Class<T> propiedad a su objeto genérico, como este:

class MyGenericObject<T> {
    private final Class<T> theClass;
    public Class<T> getTypeArg() {
        return theClass;
    }
    MyGenericObject(Class<T> theClass, ... the rest of constructor parameters) {
        this.theClass = theClass;
        ... the rest of the constructor ...
    }
}

Ahora puedes usar getTypeArg para encontrar la clase real del parámetro tipo, compárelo con Integer.class, y tomar una decisión basada en eso.


6
2018-04-19 16:54