无效的推断类型

时间:2014-05-23 11:21:46

标签: java generics ormlite

我只是想在数据库上面编写一些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 { }

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可能需要使用TypeTools之类的内容来解析类型参数:

public BaseDbHelper() {
  entityClass = TypeResolver.resolveRawArguments(BaseDbHelper.class, getClass())[0];
}

注意:这仅在BaseDbHelper被子类化时才有效,因此可以在类型定义中捕获T的值:

public BasePersonHelper extends BaseDbHelper<Person, PersonDAO> {}

否则T的值将无法在运行时检索。