Estoy muy confundida ahora. Estoy usando el siguiente código en otro proyecto sin ningún tipo de problemas:

public class ReadOnlyTable<T extends Model> implements ReadOnly<T> {
protected at.viswars.database.framework.core.DatabaseTable datasource;
private boolean debug = true;

protected ReadOnlyTable() {
    initTable();
}

protected void reloadDataSource() {
    initTable();
}

private void initTable() {
    boolean readOnlyClass = false;
    if (getClass().getSuperclass().equals(ReadOnlyTable.class)) readOnlyClass = true;

    Class<T> dataClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

La última línea se ejecutará sin problemas. Ahora he hecho un segundo proyecto y como he tenido problemas con la lectura de la Clase traté de hacer el caso más simple posible:

public class GenericObject<T> implements IGenericObject<T> {
public GenericObject() {
    init();
}

private void init() {
    Class<T> clazz = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

}

Esta clase es instanciated aquí:

        GenericObject<String> go = new GenericObject<String>();

En mi segundo ejemplo yo siempre recibir el siguiente mensaje de error:

Excepción en el thread «main» java.lang.ClassCastException: java.lang.Class no se puede lanzar a java.lang.reflejar.ParameterizedType

Lo que me estoy perdiendo?? Esto me vuelve loco. Cualquier ayuda es muy apreciada.

InformationsquelleAutor Rayden78 | 2013-02-09

2 Comentarios

  1. 3

    Está llamando getGenericSuperclass(), pero su clase no tiene un genérico de la superclase. Su superclase es Object, que no se puede convertir a ParameterizedType como el error dice.

    Usted probablemente desea utilizar getGenericInterfaces()[0], ya que su única clase implementa una interfaz.

    Más info aquí: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces()

    • Usted bien señala el error, pero getGenericInterfaces no servirá de nada. getClass() no necesariamente volver GenericObject.class desde GenericObject no final. Incluso si lo hace, getGenericInterfaces()[0] devolverá un Type que representa IGenericObject<T>, con T sin resolver.
    • Ok, tienes razón, según el mensaje de error que tengo encima, no se dio cuenta que se habla ParametrizedType. De todos modos, ¿cuál es la gran diferencia para mi primera lista, ReadOnlyTable es la parte más alta de la clase en la jerarquía, por lo que no debería ser el mismo Problema. Se trató de esta línea: Clase<T> – clazz = (Clase<T>)((ParameterizedType) getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0]; me dio el error: java.lang.ClassCastException: sol.reflejar.los medicamentos genéricos.reflectiveObjects.TypeVariableImpl no se puede convertir a java.lang.Class lo Siento, no estoy muy familiarizado con este tema, trataremos de comprobar su enlace
    • relacionados: stackoverflow.com/questions/14657542/…
    • Muchas gracias por este Enlace Pablo Bellora, me corro en mi primera lista y había un tipo resueltos, así que creo que puedo rastrear la diferencia exacta. Voy a actualizar esta pregunta cuando me enteré de mi error.
  2. 3

    Es imposible recuperar String de go. El parámetro type de un objeto de la creación de instancias de expresión (new GenericObject<String>()) no está presente en cualquier lugar en tiempo de ejecución. Este es el tipo de borrado.

    La técnica que usted está tratando de utilizar preocupaciones cuando un clase o interfaz se extiende o se implementa otra clase o interfaz con un determinado tipo de argumento. por ejemplo,class Something extends GenericObject<String>. Entonces es posible obtener este información de declaración de de la clase objeto. Esto es completamente ajena a lo que está haciendo.

Dejar respuesta

Please enter your comment!
Please enter your name here