将List <e>转换为List <t>,其中T是抽象的

时间:2016-03-16 09:48:57

标签: java list generics

我正在尝试推广一种我需要经常调用的方法。它需要List<E extends RealmObject>并返回List<T extends Pojo<E>>。从ET的转换是通过

完成的
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()创建的对象。

编辑:添加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 个答案:

答案 0 :(得分:1)

除了是一个抽象类之外,T也是一个参数类型,不能在构造函数new T()中使用。

典型的解决方案是使用反射:

  • 将附加参数Class<T> clazz传递给您的方法fromRealmList
  • 调用clazz.getConstructor(...).newInstance(...)

也许不完美,但这应该有用。

- 编辑 - 以下是不使用类型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);
   ...
}