Moyen approprié d’étendre ParseObject et d’avoir une fabrique de requêtes générique

J’ai besoin d’un moyen d’interroger différentes classes d’parsing en fonction des choix effectués par un utilisateur. J’ai abordé le problème comme suit. Veuillez indiquer comment résoudre le problème que j’ai ou suggérer une approche alternative / meilleure.

J’ai des classes A, B, C, ... qui correspondent aux classes Parse. Ils sont très similaires. J’ai donc créé la classe abstraite Q :

 public abstract class Q extends ParseObject { // some shared methods public abstract ParseQuery getQuery(); } 

Chacun de A, B, C, ... est défini comme:

 @ParseClassName("A") public class A extends Q { private static final A INSTANCE = new A(); @Override public ParseQuery getQuery() { return ParseQuery.getQuery(A.class); } public static A getInstance(){ return INSTANCE; } } 

Que j’ai l’adaptateur de recyclage suivant pour ma vue de recyclage:

 public class QAdapter extends ParseRecyclerQueryAdapter{ ... } 

L’erreur que je reçois se produit sur la ligne suivante de mon activité:

 mRecyclerAdapter = new QAdapter(this, factory, true); 

Le message d’erreur est:

 Error:(58, 70) error: incompatible types: QueryFactory cannot be converted to QueryFactory where CAP#1 is a fresh type-variable: CAP#1 extends Q from capture of ? extends Q 

J’ai essayé de rendre la définition de la classe d’adaptateur générique en tant que public class QAdapter extends ParseRecyclerQueryAdapter {... } . Cette erreur a toutefois introduit une autre erreur indiquant que QAdapter n’a pas implémenté onBindViewHolder même s’il est mis en œuvre.

Cela peut ne pas fonctionner, mais je voudrais essayer de remplacer

 public class QAdapter extends ParseRecyclerQueryAdapter{ ... } 

avec

 public class QAdapter extends ParseRecyclerQueryAdapter{ ... } 

Essayez de remplacer

 extends ParseRecyclerQueryAdapter {... } 

avec

 extends ParseRecyclerQueryAdapter {... } 

Voici comment faire fonctionner mon ParseRecyclerQueryAdapter

Eh bien, comme le dit le vieil adage, “assurez-vous que tout est contigu” ou quelque chose comme ça. Vous avez une excellente idée pour un résumé et vous le faites bien, mais peut-être avez-vous juste un problème d’inheritance en n’ayant pas le même appel émis avec les mêmes parameters que ceux traités par le processeur. comme Donc, dans ce cas, vous devez vous assurer que tout est redondant. Bonne chance!

Vous devriez rendre votre classe de base Q générique:

 public abstract class Q> extends ParseObject { // some shared methods public abstract ParseQuery getQuery(); } 

Ensuite, votre classe A devient

 @ParseClassName("A") public class A extends Q { private static final A INSTANCE = new A(); @Override public ParseQuery getQuery() { return ParseQuery.getQuery(A.class); } public static A getInstance(){ return INSTANCE; } } 

et ParseQuery est:

 public class ParseQuery { public static  ParseQuery getQuery(Class clazz) { return null; } }