Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建虚拟模板方法_Java_Templates_Virtual_Resultset - Fatal编程技术网

在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
    的对象。也许是某种工厂物品