Tengo un json con nombre de clase, algo como esto:
{ "view_class" : "com.view.MyClass" }Y tengo esta jerarquía:
public class Config { public String viewClass; ... } public interface ViewHolderInterface { void bindValue(...); } public class SuperMyClass extends RecyclerView.ViewHolder implements ViewHolderInterface { ... } public class MyClass extends SuperMyClass { ... }Leo un archivo json y genero un objeto "Config", entonces la idea es esta:
public void bindViewHolder(SuperMyClass holder, Config config) { Class viewHolderClass; try { //row.viewHolderClass = "com.view.MyClass" viewHolderClass = Class.forName(config.viewClass); } catch (final Exception exception) { } // Here I need to "cast" a holder to MyClass and execute the method bindValue. final ViewHolderInterface viewHolderInstance = (ViewHolderInterface) viewHolderClass.cast(holder); viewHolderInstance.bindObjectValue(...); }He intentado hacer este lanzamiento usando la reflexión, pero esto arroja una excepción:
java.lang.ClassCastException: SuperMyClass no se puede convertir a MyClass
Creo que mi error es usar la reflexión y al mismo tiempo intentar hacer up-cast, pero no he encontrado otra forma de hacerlo.
Considere que puede haber más de un tipo "view_class" (recuerde que esta clase es una implementación de ViewHolder).
¿Alguna idea?
Creo que mi error es usar la reflexión y al mismo tiempo intentar hacer up-cast, pero no he encontrado otra forma de hacerlo.
Tu reflejo está bien, pero el downcasting no lo está. Eche un vistazo a esta pregunta:conversión explícita de superclase a subclase
Considere que puede haber más de un tipo "view_class" (recuerde que esta clase es una implementación de ViewHolder).
Puede inspeccionar la instancia del objeto en tiempo de ejecución para averiguar su clase. No necesita decírselo a la clase por medios externos.
Puede probar un enfoque más seguro como:
// mind the comparison order from subclass upward if (MyClass.class.isInstance(holder)) { MyClass myClassHolder = (MyClass) holder; } else if (SuperMyClass.class.isInstance(holder)) { SuperMyClass superMyClassHolder = (SuperMyClass) holder; } else if (ViewHolder.class.isInstance(holder)) { ViewHolder viewHolder = (ViewHolder) holder; }