我只是想在数据库上面编写一些Generic helper(ORMLite API),我使用Maven编译它,并且使用编译构建过程失败
invalid inferred types for D; inferred type does not conform to declared bound(s)
[ERROR] inferred: com.j256.ormlite.dao.RuntimeExceptionDao<T,U>
[ERROR] bound(s): com.j256.ormlite.dao.RuntimeExceptionDao<capture#2 of ?,?>
我尝试使用JDK 1.6和1.7来构建它。
public class BaseDbHelper<T,U> extends DatabaseHelper<T, U> {
private Dao<T, U> dao = null;
private RuntimeExceptionDao<T, U> runtimeDao = null;
Class<?> entityClass;
public BaseDbHelper(Context context) {
super(context);
entityClass = (Class<?>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
@Override
public Dao<T, U> getDao() throws SQLException {
if (dao == null) {
// !!! ERROR
dao = getDao(entityClass);
}
return dao;
}
@Override
public RuntimeExceptionDao<T, U> getDataDao() {
if (runtimeDao == null) {
// !!! ERROR
runtimeDao = getRuntimeExceptionDao(entityClass);
}
return runtimeDao;
}
}
这是来自标有错误
的行的两个父类的签名public <D extends com.j256.ormlite.dao.RuntimeExceptionDao<T,?>, T> D getRuntimeExceptionDao(java.lang.Class<T> clazz) { }
public <D extends com.j256.ormlite.dao.Dao<T,?>, T> D getDao(java.lang.Class<T> clazz) throws java.sql.SQLException { }
答案 0 :(得分:1)
在这种情况下,您可能需要使用TypeTools之类的内容来解析类型参数:
public BaseDbHelper() {
entityClass = TypeResolver.resolveRawArguments(BaseDbHelper.class, getClass())[0];
}
注意:这仅在BaseDbHelper被子类化时才有效,因此可以在类型定义中捕获T
的值:
public BasePersonHelper extends BaseDbHelper<Person, PersonDAO> {}
否则T
的值将无法在运行时检索。