Ho incontrato un problema durante il tentativo di creare un ArrayAdapter generico. Probabilmente è legato alla mia comprensione limitata dei farmaci generici in Java e speravo che qualcuno potesse mettermi in chiaro. Fondamentalmente ho una classe astratta adattatore di base:Generics with ArrayAdapters
public abstract class BaseAdapter<T> extends ArrayAdapter<T>
{
....
private List<T> items;
....
protected abstract List<T> build(JSONArray jsonArray);
....
@Override
public T getItem(int position)
{
return items.get(position);
}
....
}
Poi ho un adattatore che estende questa classe di base:
public class MyAdapter extends BaseAdapter<BaseModel>
{
....
@Override
protected List<BaseModel> build(JSONArray jsonArray)
{
if (useBaseModel())
{
return BaseModel.buildBaseModels(jsonArray); //returns List<BaseModel>
}
else
{
return SubclassModel.buildSubclassModels(jsonArray); //returns List<SubclassModel>
}
}
....
}
I modelli sono definiti come:
public class BaseModel{...}
public class SubclassModel extends BaseModel{....}
Questo non lo fa compilare, come anche se SubclassModel estende BaseModel, le liste di loro non sono equivalenti. Questo thread (Most efficient way to cast List<SubClass> to List<BaseClass>) spiega tanto, e dice di usare questo, invece:
List<? extends BaseModel>
Quando cambio a:
public class MyAdapter extends BaseAdapter<? extends BaseModel>
{
...
protected List<? extends BaseModel> build(JSONArray jsonArray)
...
}
gli errori sul metodo di costruzione vanno via, ma ora c'è una classe errore di livello indicante: getItem (int) in scontri BaseAdapter con getItem (int) in android.widget.ArrayAdapter; tentare di utilizzare il tipo di reso incompatibile.
Sembra che getItem debba restituire un tipo? estende BaseModel, che è - qualcuno può consigliare?
Grazie!
+1 ..Looks come stavo scrivendo la mia risposta mentre stavate scrivendo la vostra :-) – Kal
pensieri simili , errore simile, soluzione simile, è spaventoso :) – emboss
Abbastanza sicuro - grazie rilievo e Kal! Controllerò la prima risposta. – user888867