Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

111
Vistas
Usando reflexión y polimorfismo con ViewHolder

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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; }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda