【问题标题】:SQLite creating insert statement with generics (Java + SQLite4Java)SQLite 使用泛型创建插入语句 (Java + SQLite4Java)
【发布时间】:2013-03-01 00:50:11
【问题描述】:

我正在尝试使用 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 或其他东西。

【问题讨论】:

  • 啊,我想我有预感。我正在尝试 , D extends Number> 但是我仍然需要向 bind() 方法指示 D 是什么类型的数字...但我觉得我越来越暖和了

标签: java sqlite list generics


【解决方案1】:

埃里克,

首先,D不能是int,只能是java.lang.Integer

其次,编译器在编译时不知道类型,因此它不知道与哪个 bind 匹配调用。不幸的是,sqlite4java 中没有通用的 bind

第三,由于擦除,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());

【讨论】:

  • 是的,我最终做了类似的事情,但使用了一个专注于类名的 switch 语句。嗯,还是挺好看的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多