Genéricos de Java: Comparando la clase del Objeto o con <E>


Answers

El método que siempre he usado está a continuación. Es un dolor y un poco feo, pero no he encontrado uno mejor. Debe pasar el tipo de clase en la construcción, ya que cuando se compila Generics, la información de la clase se pierde.

public class Test<E> {
    private Class<E> clazz;
    public Test(Class<E> clazz) {
       this.clazz = clazz;
    }
    public boolean sameClassAs(Object o) {
        return this.clazz.isInstance(o);
    }
}
Question

Digamos que tengo la siguiente clase:

public class Test<E> {
    public boolean sameClassAs(Object o) {
        // TODO help!
    }
}

¿Cómo verificaría que o es la misma clase que E ?

Test<String> test = new Test<String>();
test.sameClassAs("a string"); // returns true;
test.sameClassAs(4); // returns false;

No puedo cambiar la firma del método de (Object o) ya que estoy redefiniendo una superclase y no puedo elegir la firma de mi método.

También preferiría no ir por el camino de intentar un elenco y luego atrapar la excepción resultante si falla.




Solo estaba tratando de hacer lo mismo, y un truco ingenioso que acabo de darme cuenta es que puedes probar un yeso, y si el lanzamiento falla, se lanzará ClassCastException. Puedes atrapar eso y hacer lo que sea.

por lo que su método sameClassAs debería ser similar a:

public boolean sameClassAs(Object o) {
    boolean same = false;
    try {
        E t = (E)o;
        same = true;
    } catch (ClassCastException e) {
        // same is false, nothing else to do
    } finally {
        return same;
    }
}





Links