Java 无法在泛型中实例化该类型

Java 无法在泛型中实例化该类型,java,generics,Java,Generics,我使用apachecommondbutils来处理与数据库相关的操作,对于我的前端,我使用Dojo,我希望不同的POJO类使用ArrayList,而不是简单的ResultSet。下面是我当前的方法,我有几种类似的方法,我想实现Gnerics,这样我就可以从代码中删除这种重复。我试图实现泛型,但在newbeanListHandler(?.class)中失败点,我得到 Cannot instantiate the type BeanListHandler<?> 无法实例化类型BeanL

我使用apachecommondbutils来处理与数据库相关的操作,对于我的前端,我使用Dojo,我希望不同的POJO类使用ArrayList,而不是简单的ResultSet。下面是我当前的方法,我有几种类似的方法,我想实现Gnerics,这样我就可以从代码中删除这种重复。我试图实现泛型,但在
newbeanListHandler(?.class)中失败点,我得到

Cannot instantiate the type BeanListHandler<?>
无法实例化类型BeanListHandler
请帮助我解决这个问题,因为我是一个在很长时间后返回的Java程序员,我需要你们的帮助,我将非常感谢,也提前感谢

这是我的工作代码

public List<DigitalCertificate> listValidCertificates()
{
    final String methodName = "listValidCertificates";
    logger.entering(CLASS_NAME, methodName);

    try
    {
        QueryRunner run = new QueryRunner(getDataSource());
        ResultSetHandler<List<DigitalCertificate>> rsHandler = new BeanListHandler<DigitalCertificate>(DigitalCertificate.class);
        List<DigitalCertificate> certificates = run.query(SQL_VALID_CERTIFICATES, rsHandler);

        if (logger.isLoggable(Level.FINER))
        {
            logger.logp(Level.FINER, CLASS_NAME, methodName, "run.query : executed.");
            logger.logp(Level.FINER, CLASS_NAME, methodName, "SQL Statement is " + SQL_VALID_CERTIFICATES);
        }

        logger.exiting(CLASS_NAME, methodName);
        return certificates;
    }
    catch (Exception e)
    {}
}
公共列表listValidCertificates()
{
最终字符串methodName=“listValidCertificates”;
输入(类名称、方法名称);
尝试
{
QueryRunner run=newQueryRunner(getDataSource());
ResultSetHandler rsHandler=新的BeanListHandler(DigitalCertificate.class);
列表证书=run.query(SQL\u有效\u证书,rsHandler);
if(记录器isLoggable(级别更精细))
{
logp(Level.FINER,CLASS_名称,methodName,“run.query:executed.”);
logp(Level.FINER,CLASS_NAME,methodName,“SQL语句是”+SQL_有效证书);
}
正在退出(类名称、方法名称);
退货证明书;
}
捕获(例外e)
{}
}
这是我失败的泛型转换

public List<?> runQuerySQLToGetList(String SQL, Object[] params)
{
    final String methodName = "runQuerySQLToGetList";
    Object methodParams [] = {SQL, params} ; 
    logger.entering(CLASS_NAME, methodName, params);

    try
    {
        QueryRunner run = new QueryRunner(getDataSource());
        ResultSetHandler<List<?>> rsHandler = new BeanListHandler<?>(?.class);

        List<?> certificates = run.query(SQL, rsHandler);

        if (logger.isLoggable(Level.FINER))
        {
            logger.logp(Level.FINER, CLASS_NAME, methodName, "run.query : executed.");
            logger.logp(Level.FINER, CLASS_NAME, methodName, "SQL Statement is " + SQL);
        }

        logger.exiting(CLASS_NAME, methodName);
        return certificates;
    }
    catch (Exception e)
    {}
}   
公共列表runQuerySQLToGetList(字符串SQL,对象[]参数)
{
最终字符串methodName=“runQuerySQLToGetList”;
对象methodParams[]={SQL,params};
输入(类名称、方法名称、参数);
尝试
{
QueryRunner run=newQueryRunner(getDataSource());
结果萨德勒(?类);
列表证书=run.query(SQL、rsHandler);
if(记录器isLoggable(级别更精细))
{
logp(Level.FINER,CLASS_名称,methodName,“run.query:executed.”);
logp(Level.FINER,CLASS_NAME,methodName,“SQL语句为”+SQL);
}
正在退出(类名称、方法名称);
退货证明书;
}
捕获(例外e)
{}
}   

您必须使用泛型类型参数而不是

public <T> List<T> runQuerySQLToGetList(String SQL, Object[] params, Class<T> clazz) {
...
    ResultSetHandler<List<T>> rsHandler = new BeanListHandler<T>(clazz);
...
}
public List runQuerySQLToGetList(字符串SQL,对象[]参数,类clazz){
...
ResultSetHandler rsHandler=新BeanListHandler(clazz);
...
}

这是无效的语法。请回顾一下你的泛型教程、注释等。您必须使用命名类型,而不是通配符(通配符是任何位置的占位符;为类型指定名称可以显式指定要在何处使用该类型),以及2。您不能执行
?.class
,甚至
t.class
,您要么将
类作为参数传递给方法(出于同样的原因
BeanListHandle
将类作为构造函数参数),要么必须有该类型的对象可供调用
.getClass()
。你可能想读一下这本书。这是一个开始。然后,
List certificates=run.query(SQL,rsHandler)将出现另一组问题