2016-03-16 4 views
0

Я пытаюсь обобщить метод, который мне нужно будет назвать много. Он принимает List<E extends RealmObject> и возвращает List<T extends Pojo<E>>. Переход от E к T осуществляется черезСписок преобразований <E> в список <T>, где T является абстрактным

new T().fromRealm(realmObject) 

Это не будет работать, потому что T является абстрактным классом, так что я не могу создать его экземпляр.

public static <E extends RealmObject, T extends Pojo<E>> List<T> fromRealmList(
     RealmList<E> realmList) { 
    List<T> pojoObjects = new ArrayList<>(); 
    if (realmList != null) { 
     for (E realmObject : realmList) { 
      try { 
       pojoObjects.add(new T().fromRealm(realmObject)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return pojoObjects; 
} 

Я также попытался с this answer, но List<T> не будет принимать объект, созданный с clazz.newInstance().

EDIT: добавление Pojo класс

public abstract class Pojo<R extends RealmObject> { 

@NonNull 
public abstract R toRealm(); 

@NonNull 
public abstract Pojo<R> fromRealm(R realmObject); 
} 

EDIT2: добавление альтернативное решение, что до сих пор не работает: Required T, found Pojo<E>.

T newInstance = clazz.getConstructor() 
        .newInstance() 
        .fromRealm(realmObject); 
       pojoObjects.add(newInstance); 

ответ

1

Помимо того, что абстрактный класс, T также является параметром тип, который не может использоваться в конструкторе new T().

Типичное решение было бы использовать отражение:

  • передать дополнительный параметр Class<T> clazz к вашему методу fromRealmList
  • вызова clazz.getConstructor(...).newInstance(...)

Может быть, не идеальный, но это должно работать.

--edit-- Ниже приведен пример без использования типа T:

public static <E extends RealmObject> List<Pojo<E>> fromRealmList(
    RealmList<E> realmList, Class<Pojo<E>> clazz) { 

    List<Pojo<E>> pojoObjects = new ArrayList<>(); 
    ... 
    Pojo<E> newInstance = clazz.getConstructor(...).newInstance(...).fromRealm(...); 
    pojoObjects.add(newInstance); 
    ... 
} 
+0

Я отредактировал мой вопрос с большим количеством некоторого кода. –

+0

Проблема заключается в методе .fromRealm, но я не могу понять, почему возвращаемый тип - Pojo , что верно. –

+0

В вашем случае вы можете безопасно отбрасывать возвращаемое значение 'fromRealm' в' T', однако вы получите предупреждение о компиляторе. На самом деле лучше удалить тип «T» и работать с «Pojo ». В конце концов, ваш 'pojoObjects' не содержит' T extends Pojo '' s, но фактический 'Pojo ' 's. Я адаптировал ответ. – geert3

Смежные вопросы