0

Javaジェネリックを使用して挿入コマンドを作成しようとしています。基本的に、addrow()関数型を安全で、さまざまなテーブルで使用できるようにしたいです。出来ますか?

これが私の現在のJavaコードです:

public <T extends List<D>, D extends Number> boolean addRow(T rowData) throws SQLiteException {
    int index = 0;
    for (D element : rowData) {
        addRowStatement.bind(index++, element); // element must have a type part and value part
    }
    return addRowStatement.step();
}

addRowStatementのタイプがSQLiteStatementであり、私が理解していることから、アイテムをそれにバインドし続けることができます。

ArrayList T内のデータは、bytes、int、またはこのようなプリミティブのいずれかになります。私のコードはこれを処理します。すべてのデータをエレガントにバインドし(バインドするものがいくつあっても)、ステートメントを実行したいだけです。

具体的には、エラーは、bind()メソッドが「D」ジェネリックをどう処理するかを認識していないことです。ただし、Dジェネリックはintまたはbyteなどであることが判明します。

4

1 に答える 1

0

エリック、

まず、Dintにすることはできず、 java.lang.Integerのみにすることができます。

次に、コンパイラはコンパイル時に型を認識しないため、呼び出しに一致するバインドを認識しません。残念ながら、sqlite4javaには一般的なバインドはありません。

第三に、消去のため、実行時にDのタイプがわからないため、確認する必要があります。

したがって、解決策は次のとおりです。

if (element == null) addRowStatement.bindNull(index++);
else if (element instanceof Integer) addRowStatement.bind(index++, (Integer)element);
else if (element instanceof Long) addRowStatement.bind(index++, (Long)element);
...
else throw new AssertionError("unsupported type " + element.getClass());

または、より簡単に、すべての数値を長い数値に変換できる場合は、次のようになります。

if (element == null) addRowStatement.bindNull(index++);
else addRowStatement.bind(index++, element.longValue());
于 2013-03-01T08:58:22.807 に答える