Резюме проблемы:
Я хотел бы передать класс с параметром типа (например, ArrayList<SomeClass>
, например) в общий метод как параметр типа.
Скажем, у меня есть метод:
public static <T> T getGenericObjectFromJson(String json, Class<T> genericType){
// details unimportant, basically returns an object of specified type
return JsonParser.fromJson(json, genericType);
}
Этот метод, конечно, будет отлично работать для любого класса. Я могу вызвать такой метод, например:
getGenericObjectFromJson(jsonString, User.class)
Проблема: Я обнаружил, что не могу этого сделать:
getGenericObjectFromJson(jsonString, ArrayList<User>.class)
Синтаксически это явно недействительно. Однако я не уверен, как бы я мог добиться чего-то подобного. Я могу, конечно, пройти ArrayList.class
, однако добавление родового типа делает его более синтаксически недействительным, и я не могу думать об этом.
Единственное прямое решение было чем-то вроде этого (что кажется довольно глупым):
getGenericObjectFromJson(jsonString, new ArrayList<User>().getClass())
Однако мы все равно теряем общий тип и просто возвращаем ArrayList неизвестного типа (хотя его можно отличить). Кроме того, без необходимости создавать экземпляр объекта.
Мое единственное решение до сих пор заключалось в том, чтобы обернуть этот метод в классе, который содержит параметр универсального типа, который может быть создан таким образом:
public class JsonDeserializer<T>...
В этом случае метод getGenericObjectFromJson
будет использовать общий тип класса.
Вопрос (ы): В конечном счете мне любопытно, почему я не могу передать класс с параметром типа, и есть ли способ выполнить то, что я пытался сделать.
Как всегда, дайте мне знать, есть ли какие-либо проблемы с этим вопросом.