如何实现基于用户选择返回类型的Java函数?

时间:2019-04-30 21:31:08

标签: java generics

我正在尝试实现此方法,该方法接受数据库的行名和列名,并返回该单元格中的值。用户期望的类型由他们通过Class<T> type指定。

// This return T, the value under the columnName in the row.
public <T> T getColumnByName(Row row, String columnName, Class<T> type)

我可以访问名为Row的对象,它方便地为我提供了以下方法:

row.getString(String columnName) // Gets String stored under column
row.getLong(String columnName) // Gets the Long stored under column
etc...

所以这是很基本的,但是关于泛型我有些卡住了。我试图通过以下方式实现getColumnByName

private <T> T getColumnByName(Row row, String name, Class<T> type) {
  if (type == Long.class) {
    return row.getLong(name);
  } else if (type == String.class) {
    return row.getString(name);
  } ... continued...
}

但是,出现错误“类型不兼容,必需:T,找到:长”。 我不确定如何处理将Row方法返回的具体类型转换为编译器可以接受的通用类型。

有什么想法可以做到吗?

1 个答案:

答案 0 :(得分:2)

您可以使用传入的用户Class<T>来使编译器确信代码的正确性,尽管这样做确实增加了额外的运行时强制转换的开销:

private <T> T getColumnByName(Row row, String name, Class<T> type) {
  if (type == Long.class) {
    return type.cast(row.getLong(name));
  } else if (type == String.class) {
    return type.cast(row.getString(name));
  } ... continued...
}