2015-11-26 3 views
9

Ho bisogno di un modo per interrogare diverse classi di analisi in base alle scelte fatte da un utente. Mi sono avvicinato al problema come segue. Si prega di avvisare come risolvere il problema che ho o suggerire un approccio alternativo/migliore.Modo corretto per estendere ParseObject e disporre di una generica factory di query

Ho classi A, B, C, ... corrispondenti a classi Parse. Sono molto simili. Così, ho creato classe astratta Q:

public abstract class Q extends ParseObject { 
    // some shared methods 

    public abstract ParseQuery<? extends Q> getQuery(); 
} 

Ognuno di A, B, C, ... è definito come:

@ParseClassName("A") 
public class A extends Q { 
    private static final A INSTANCE = new A(); 

    @Override 
    public ParseQuery<A> getQuery() { 
     return ParseQuery.getQuery(A.class); 
    } 

    public static A getInstance(){ 
     return INSTANCE; 
    } 
} 

Che ho il seguente adattatore di riciclo per il mio punto di vista di riciclo:

public class QAdapter extends ParseRecyclerQueryAdapter<Q,QAdapter.MyViewHolder>{ ... } 

L'errore Mi sto capendo sulla linea seguente nella mia attività:

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

Il messaggio di errore è:

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

Ho cercato di rendere la definizione della classe di adattatori generico public class QAdapter<T extends Q> extends ParseRecyclerQueryAdapter<T, QAdapter.MyViewHolder> {... }, eppure questo introdotto un altro errore che dice che non ha attuato QAdapter onBindViewHolder anche se è implementato.

+0

Quale classe si chiamano 'mRecyclerAdapter = nuovo QAdapter (questo, factory, true); 'da? E che tipo è 'fabbrica'? – Mike

risposta

0

Questo non può funzionare, ma vorrei provare a sostituire

public class QAdapter extends ParseRecyclerQueryAdapter<Q,QAdapter.MyViewHolder>{ ... } 

con

public class QAdapter extends ParseRecyclerQueryAdapter<? extends Q,QAdapter.MyViewHolder>{ ... } 
0

provare a sostituire

extends ParseRecyclerQueryAdapter<T, QAdapter.MyViewHolder> {... } 

con

extends ParseRecyclerQueryAdapter<T extends ParseObject, QAdapter.MyViewHolder> {... } 

Questo è come fare il mio lavoro ParseRecyclerQueryAdapter

0

Beh, come dice un vecchio proverbio, "assicurarsi che tutto è contiguo" o qualcosa di simile. Hai una grande idea per un abstract e lo stai facendo nel modo giusto, ma forse hai appena avuto un problema di ereditarietà non avendo la stessa chiamata emessa dagli stessi parametri incontrati dal processore. come <? extends Q,...> Quindi in tal caso devi assicurarti che sia tutto ridondante. In bocca al lupo!

0

Si dovrebbe fare la classe di base D generico:

public abstract class Q<T extends Q<T>> extends ParseObject { 
    // some shared methods 

    public abstract ParseQuery<T> getQuery(); 
} 

Poi la classe A diventa

@ParseClassName("A") 
public class A extends Q<A> { 
    private static final A INSTANCE = new A(); 

    @Override 
    public ParseQuery<A> getQuery() { 
     return ParseQuery.getQuery(A.class); 
    } 

    public static A getInstance(){ 
     return INSTANCE; 
    } 
} 

e ParseQuery è:

public class ParseQuery<T> { 
    public static <T> ParseQuery<T> getQuery(Class<T> clazz) { 
     return null; 
    } 
} 
Problemi correlati