我正在尝试推广一种我需要经常调用的方法。它需要List<E extends RealmObject>
并返回List<T extends Pojo<E>>
。从E
到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()
创建的对象。
编辑:添加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);
答案 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);
...
}