Распространенной ошибкой является попытка метода с сигнатурой, например:
<T> T fn()
В Java нет способа узнать в вызове fn
что T
.Возможны варианты возврата null
, небезопасного приведения объекта, который может быть или не быть T
, или выдачи исключения.Если у вас есть что-то похожее, но тип возврата List<T>
, единственное, что вы можете сохранить в этом списке, это null
.
Так что же делать.Обычно вы передаете аргумент для создания требуемого типа.Функциональный объект, например.(Я бы использовал java.util.function.Function
, но мешали проверенные исключения.)
List<String> names = getColumn(
"SELECT [...]",
(result, column) -> result.getString(column)
);
[...]
interface ResultFunction<T> {
T get(ResultSet results, int column) throws SQLException;
}
public <T> List<T> getColumn(
String sql, ResultFunction<T> function
) throws SQLException {
List<T> values = new ArrayList<>();
try (ResultSet result = _stmt.executeQuery(sql)) {
while (result.next()) {
values.add(function.get(result, 1));
}
}
return values;
}
Возможно, вы захотите расширить функциональность ResultFunction
и, возможно, использовать перечисления.