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