我正在尝试实现此方法,该方法接受数据库的行名和列名,并返回该单元格中的值。用户期望的类型由他们通过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
方法返回的具体类型转换为编译器可以接受的通用类型。
有什么想法可以做到吗?
答案 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...
}