¿Cómo se genera la clase con T y List <T>

Estoy tratando de generar mi estructura de clase.
Mostraré mi estructura real para ser más específica.

Estoy escribiendo la aplicación con soporte de modo offline, así que decidí implementar mi mecanismo de cache ETag en el uso de Robospice y GreenDao ORM .

Necesito poner en caché sólo las solicitudes GET .

En primer lugar mis peticiones deben extender la solicitud de base (no la mía), en mi caso RetrofitSpiceRequest<T, V>

 T is type of return data V is service type, in my case I am using Retrofit. 

El problema es que el tipo de retorno no es la List of T tipos List of T por defecto y necesito crear una subclase que extienda la matriz de objetos T y que lo usen como tipo de retorno.

Algo como esto

 public class City { .... .... .... public static class List extends ArrayList<City> { ..... ..... } } 

Y utilice City.List como tipo de devolución.

Pero tengo mi DAO declarado como siguiente

 public class CityDao extends AbstractDao<City, Long> { } 

En cada solicitud (GET) necesito tener DAO específico como un miembro con el fin de los datos de la caché si difiere de los datos del servidor. O cargar datos de la base de datos local si no hay conexión.

El problema aquí es que la solicitud generada por el tipo T que es la mayoría de la lista, City.List en mi caso, de algunos objetos, pero mi dao se genera por, por ejemplo E tipo que es la ciudad en mi caso.

Quiero crear un método como este

 public AbastractDao<T,Long> getRequestDao() { } 

Pero en la medida en que mi solicitud devuelve City.List, no tengo idea de cómo generar esta clase, siento que es posible, pero ahora no hay ideas.
En caso de no genérico método dao, tengo que duplicar código como este

  @Override public void insertReceivedData(City.List received) { mCityDao.insertOrReplaceInTx(received); } @Override public City.List getCachedData() { if (mFilterMap != null && mFilterMap.size() > 0) { return (City.List) mCityDao.loadAll(); } else { WhereCondition[] whereConditions = QueryUtils.convertPropertyMapToConditionalArray(mFilterMap); return (City.List) mCityDao.queryBuilder().where(whereConditions[0], Arrays.copyOfRange(whereConditions, 1, whereConditions.length)).list(); } } 

En cada solicitud

Por favor comparta sus ideas.

Gracias.

Termino con la siguiente solución. No es tan bueno como yo quería, pero funciona y mejor que duplicar código.

Mi clase de solicitud base.

 public abstract class BaseGetRequest<L extends List<T>, T, V> extends RetrofitSpiceRequest<L, V> implements FilterableRequest { // Context protected Context mContext; // Filter used in request and in queries protected Map<Property, String> mFilterMap; // Session provided Singletone protected DaoSessionProvider mSessionProvider; public BaseGetRequest(Class<L> clazz, Class<V> retrofitedInterfaceClass, Context context, Map<Property, String> filterMap) { super(clazz, retrofitedInterfaceClass); mContext = context; mFilterMap = filterMap; mSessionProvider = ((DaoSessionProvider) mContext.getApplicationContext()); // TODO determine required retry count setRetryPolicy(new RetryPolicy() { @Override public int getRetryCount() { return 0; } @Override public void retry(SpiceException e) { } @Override public long getDelayBeforeRetry() { return 0; } }); } protected WhereCondition[] getWhereConditions() { return QueryUtils.convertPropertyMapToConditionalArray(mFilterMap); } public BaseGetRequestV2(Class<L> clazz, Class<V> retrofitedInterfaceClass, Context context) { this(clazz, retrofitedInterfaceClass, context, null); } public abstract AbstractDao<T, Long> getDao(); public abstract L createDataList(List<T> list); public L getCachedData() { if (mFilterMap != null && mFilterMap.size() > 0) { WhereCondition[] whereConditions = getWhereConditions(); return createDataList(getDao().queryBuilder().where(whereConditions[0], Arrays.copyOfRange(whereConditions, 1, whereConditions.length)).list()); } else { return createDataList(getDao().loadAll()); } } public abstract L getData(); @Override public Map<Property, String> getFilterMap() { return mFilterMap; } public Map<String, String> getStringMap() { return QueryUtils.convertPropertyMapToString(mFilterMap); } @Override public L loadDataFromNetwork() throws Exception { L receivedData = null; try { receivedData = getData(); WhereCondition[] conditions = getWhereConditions(); getDao().queryBuilder().where(conditions[0],Arrays.copyOfRange(conditions, 1, conditions.length)).buildDelete().executeDeleteWithoutDetachingEntities(); getDao().insertOrReplaceInTx(receivedData); } catch (Exception ex) { receivedData = getCachedData(); } return receivedData; } } 

Y puedo extender esta clase

Public class NewsRequest extends BaseGetRequest {público estático final String TARGET_URL = "/ news"; NoticiasArticleDao mNewsArticleDao;

 public NewsRequest(Context context) { this(context, null); } public NewsRequest(Context context, Map<Property, String> filterMap) { super(NewsArticle.List.class, API.class, context, filterMap); mNewsArticleDao = mSessionProvider.getDaoSession().getNewsArticleDao(); } @Override public AbstractDao<NewsArticle, Long> getDao() { return mNewsArticleDao; } @Override public NewsArticle.List createDataList(List<NewsArticle> list) { return new NewsArticle.List(list); } @Override public NewsArticle.List getData() { return getService().getNews(getStringMap()); } 

}

  • El edificio con maven falla
  • ¿Es realmente necesario RoboSpice shouldStop ()?
  • Detener un proceso de fondo en robospice
  • Subir una imagen a Google appengine utilizando Robospice con Retrofit
  • No hay ningún error de este tipo al usar robospice-retrofit y getstream.io
  • ¿Puedo usar SpiceManager dentro de un servicio?
  • RoboSpice y ORMLite - Acceso a los datos
  • Obtención de datos del caché antes de ejecutar una solicitud de red con RoboSpice
  • ¿Cómo aumentar el tiempo de espera para las solicitudes de reacondicionamiento en robospice android?
  • Robospice solicitud nunca termina si la aplicación va en el fondo y luego llega a primer plano?
  • Objeto de almacenamiento Robospice que extiende ArrayList en la base de datos a través de Ormlite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.