2013-03-01 57 views
0

我想使用java泛型进行插入命令。基本上,我想让我的addrow()函数类型安全并可用于不同的表。可能吗?SQLite用泛型创建插入语句(Java + SQLite4Java)

这里是我当前的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或其他东西。

+0

嗯,我认为我有一种预感。我试着,D扩展Number>但是我仍然需要指定bind()方法D的类型是什么...但是我感觉我变暖了 – 2013-03-01 01:51:13

回答

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

或者更简单的,如果你能每天转换为长走:

if (element == null) addRowStatement.bindNull(index++); 
else addRowStatement.bind(index++, element.longValue()); 
+0

是的,我最终做了类似这但是有一个关于类名的switch语句。嗯,它仍然很好看:) – 2013-03-01 17:12:36