在Java中创建虚拟模板方法
我试图创造的情况如下: 我有一个基类,其中包含一个静态模板方法,该方法接收由数据库中的查询填充的在Java中创建虚拟模板方法,java,templates,virtual,resultset,Java,Templates,Virtual,Resultset,我试图创造的情况如下: 我有一个基类,其中包含一个静态模板方法,该方法接收由数据库中的查询填充的ResultSet,并返回一个包含正确结果的列表 我有一些类,它们派生自上面引用的类,表示数据库中的每个表,它们都有一个构造函数,用于接收ResultSet并构建对象 我写的代码是: public class TableBase { public static <T extends TableBase> List<T> getResults(ResultSet p_R
ResultSet
,并返回一个包含正确结果的列表
我有一些类,它们派生自上面引用的类,表示数据库中的每个表,它们都有一个构造函数,用于接收ResultSet
并构建对象
我写的代码是:
public class TableBase
{
public static <T extends TableBase> List<T> getResults(ResultSet p_Rs) throws SQLException, InstantiationException, IllegalAccessException
{
List<T> v_Table = new ArrayList<T>();
T v_TB = null;
while(p_Rs.next())
v_Table.add(new T(p_Rs));
return v_Table;
}
}
公共类数据库
{
公共静态列表getResults(ResultSet p_Rs)抛出SQLException、InstanceionException、IllegalAccessException
{
List v_Table=new ArrayList();
T v_TB=零;
while(p_Rs.next())
v_表添加(新的T(p_r));
返回v_表;
}
}
我得到的错误是:无法实例化类型T
我很清楚,编译器必须“知道”所有子类都将实现接收ResultSet
变量的构造函数,但我不能创建“抽象构造函数”
有人知道如何解决这个问题吗
提前谢谢大家。你们不能那样做。您必须准确地告诉运行时类型 也许你可以这样做:
TableBase
必须具有默认构造函数TableBase
必须具有setResultSet方法
public class TableBase {
public static <T extends TableBase> List<T> getResults(ResultSet p_Rs, Class<T> clazz)
throws SQLException, InstantiationException, IllegalAccessException {
List<T> v_Table = new ArrayList<T>();
T v_TB = clazz.newInstance();
while (p_Rs.next())
v_TB.setResultSet(p_Rs);
v_Table.add(v_TB);
return v_Table;
}
}
公共类数据库{
公共静态列表getResults(结果集p_Rs,类clazz)
抛出SQLException、InstanceionException、IllegalAccessException{
List v_Table=new ArrayList();
T v_TB=clazz.newInstance();
while(p_Rs.next())
v_TB.setResultSet(p_Rs);
v_表。添加(v_TB);
返回v_表;
}
}
不能实例化泛型类型 你可以使用任何一个工厂
public static <T extends TableBase> List<T> getResults
(ResultSet p_Rs, Factory<T> factory)
//Create instance using factory
公共静态列表getResults
(结果集p_Rs,工厂)
//使用工厂创建实例
或类作为类型
public static <T extends TableBase> List<T> getResults
(ResultSet p_Rs, Class<T> type)
//type.newInstance()
公共静态列表getResults
(结果集p_Rs,类类型)
//type.newInstance()
您可以使用反射,例如:
while(p_Rs.next())
v_Table.add(newInstance(T, p_Rs));
public <T extends TableBase> T newInstance(T t, ResultSet p_Rs){
try {
Constructor constructor = t.getClass().getDeclaredConstructor(ResultSet.class);
return (T)constructor.newInstance(p_Rs);
} catch (Exception e) {
throw new RuntimeException();
}
}
while(p_Rs.next())
v_Table.add(newInstance(T,p_Rs));
公共T新实例(T,结果集p_Rs){
试一试{
构造函数构造函数=t.getClass().getDeclaredConstructor(ResultSet.class);
return(T)constructor.newInstance(p_Rs);
}捕获(例外e){
抛出新的RuntimeException();
}
}
您必须将函数传递给某个了解T
的对象。也许是某种工厂物品