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 中的数据可以是字节、整数或类似这样的原语。我的代码处理这个。我只想优雅地绑定所有数据(无论要绑定多少东西)并执行语句。

具体来说,错误是 bind() 方法不知道如何处理“D”泛型——即使 D 泛型将变成一个 int 或 byte 或其他东西。

4

1 回答 1

0

埃里克,

首先,D不能是int,只能是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());

或者更简单,如果您可以将每个Number转换为 long:

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