2011-05-09 12 views
12

Siempre he pensado que lo siguiente debería funcionar. Obtengo un objeto que sé que es Class<X> donde X amplía alguna clase Xyz. Con el fin de que sea de tipo seguro que quería utilizar Class.asSubclass como en el siguiente método:Genéricos y Class.asSubclass

private Class<? extends Xyz> castToXyzClass(Object o) { 
    final Class<?> resultClass = (Class<?>) o; 
    final Class<? extends Xyz> result = Xyz.class.asSubclass(resultClass); 
    return result; 
} 

Sin embargo, en Eclipse no funciona, la única solución que veo es un reparto sin marcar. Apuesto a que el código anterior debe funcionar, ya he usado algo como esto ... no tengo idea de qué está mal aquí.

Respuesta

18

asSubclass() opera en el objeto al que está llamado, no en su parámetro, no a lo que se está acostumbrado, pero se lee bastante bien. Sólo tienes que hacer esto:

final Class<? extends Xyz> result = resultClass.asSubclass(Xyz.class); 
+0

Sabía que era algo muy trivial .... mucho. – maaartinus

+8

Personalmente creo que leería mejor si fuera 'resultClass.asSubclassOf (Xyz.class)'. –

9

El asSubclass es un poco de un nombre confuso, ya que no es la obtención de un objeto de clase que representa la subclase, que está obteniendo el mismo objeto clase que está a mecanografiar a Reflejar que es una subclase de algunos padre clase.

De hecho, este método es bastante único (y creo que lo has encontrado) ... es para tomar una clase raw o wildcarded y obtener un mejor tipo de parámetro con una verificación de tiempo de ejecución. No es necesario cuando no tiene lagunas en la información de su tipo:

class Super {} 
class Sub extends Super {} 

//... 
Class<Sub> subClass = Sub.class; 

//both work, but the latter introduces a redundant runtime check 
Class<? extends Super> subOfSuper1 = subClass; 
Class<? extends Super> subOfSuper2 = subClass.asSubclass(Super.class);