Map<String,Object>.class
не является допустимой ссылкой на класс, потому что
Классы с суффиксом (<..>
) не являются допустимыми переменными класса.
Вы можете сделать это:
result.allRowsAs(Map.class);
И вы также должны определить allRowsAs()
, чтобы вернуть List<? extends T>
:
public <T> List<? extends T> allRowsAs(Class<T> target){...}
Но это приведет к необработанному предупреждению типа, так как Map
является универсальным классом, и вы также должны добавить непроверенное приведение к List<Map<String, Object>>
, например:
List<Map<String, Object>> results = (List<Map<String, Object>>) result.allRowsAs(Map.class);
Это определенно не тот способ следовать: непроверенное приведение, очень подробный код на стороне клиента.
В качестве альтернативы вы можете определить метод, специфичный для этого требования:
public <T, U> List<Map<T, U>> allRowsAsMap() {
// use the map that has rows
Map<String, Integer> map = ...;
// cast it to Map<T,U> : not safe but not choice in these conditions
list.add((Map<T, U>) map);
}
И вы можете использовать его:
List<Map<String, Integer>> list = allRowsAsMap();
Но таким образом, как и в вашем исходном коде, я думаю, что вы не используете дженерики, как следует.
Дженерики разработаны так, чтобы предлагать универсальность и тип безопасности .
Здесь вам не нужна безопасность типов, и универсальность в некотором роде побеждена, так как вы не знаете, чем на самом деле манипулируете.
В вашем случае вам, вероятно, не следует использовать универсальный метод scoped, а использовать универсальные типы с заранее известными типами параметров:
public List<Map<String, Integer>> allRowsAsMap() {...}
Это менее "сексуально", но более надёжно: нет актерского состава, и вы знаете, чем манипулируете.