4

私が作成しようとしている状況は次のとおりです。

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;
    }
}

私が得たエラーは次のとおりCannot instantiate the type Tです。

すべての子クラスが変数を受け取るコンストラクターを実装することをコンパイラーが「知る」必要があることは明らかですがResultSet、「抽象コンストラクター」を作成することはできません。

誰もそれを解決する方法の手がかりを持っていますか?

よろしくお願いします。

4

3 に答える 3

2

ジェネリック型をインスタンス化することはできません。

いずれかのファクトリーを使用できます

 public static <T extends TableBase> List<T> getResults
 (ResultSet p_Rs, Factory<T> factory)

//Create instance using factory 

またはタイプとしてのクラス。

public static <T extends TableBase> List<T> getResults
(ResultSet p_Rs, Class<T> type)
//type.newInstance()
于 2012-09-27T03:16:19.553 に答える
1

あなたはそれをすることはできません。ランタイムに正確にタイプを伝える必要があります。

多分あなたはこのようにすることができます:</ p>

  1. TableBaseデフォルトのコンストラクターが必要です。
  2. TableBasesetResultSetメソッドが必要です。

    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;
      }
    }
    
于 2012-09-27T02:41:15.507 に答える
0

次のようなリフレクトを使用できます。

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();
        } 

}
于 2012-09-27T03:24:36.510 に答える