Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
SQLite使用泛型创建insert语句(Java+;SQLite4Java)_Java_Sqlite_List_Generics - Fatal编程技术网

SQLite使用泛型创建insert语句(Java+;SQLite4Java)

SQLite使用泛型创建insert语句(Java+;SQLite4Java),java,sqlite,list,generics,Java,Sqlite,List,Generics,我正在尝试使用java泛型生成一个insert命令。基本上,我希望使addrow()函数类型安全并可用于不同的表。可能吗 以下是我当前的java代码: public <T extends List<D>, D extends Number> boolean addRow(T rowData) throws SQLiteException { int index = 0; for (D element : rowData) { addRowS

我正在尝试使用java泛型生成一个insert命令。基本上,我希望使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();
}
public boolean addRow(T rowData)抛出SQLiteException{
int指数=0;
对于(D元素:行数据){
addRowStatement.bind(index++,element);//元素必须有类型部分和值部分
}
返回addRowStatement.step();
}
addRowStatement的类型为SQLiteStatement,据我所知,可以将项目绑定到它

ArrayList T中的数据可以是字节、整数或类似于这样的基元。我的代码处理这个问题。我只想优雅地绑定所有数据(不管有多少东西需要绑定)并执行语句

具体地说,错误在于bind()方法不知道如何处理“D”泛型——即使D泛型会变成int或byte之类的东西。

Eric

首先,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());
或者更简单,如果您可以将每个数字转换为长:


啊,我想我有预感。我正在尝试,但是我仍然需要向bind()方法说明数字D的类型。。。但是我觉得我越来越热了是的,我最后做了类似的事情,但是用了一个switch语句,重点放在类名上。哎,还是挺好看的:)
if (element == null) addRowStatement.bindNull(index++);
else addRowStatement.bind(index++, element.longValue());