Как можно создать экземпляр класса <T>из T? - PullRequest
4 голосов
/ 04 ноября 2011

У меня есть следующий метод:

public <T> execute(HttpRequest request) {
   ...
   // in parseAs i have to pass Class<T> how can I instantiate it from T?
   request.execute().parseAs(classT);
}

PS: parseAs - это метод из клиентской библиотеки Google http .

1 Ответ

5 голосов
/ 04 ноября 2011

Вы не можете с этими параметрами.

Обобщения Java используют так называемое стирание типов - в основном все эти T становятся Object во время выполнения. Поэтому, если вам действительно нужно знать, к какому классу относится этот T, вам понадобится передать объект Class. Это именно то, что делает parseAs - чтобы вызвать parseAs<String>, вы должны вызвать parseAs(String.class).

Однако у вашего execute нет параметра Class. Таким образом, он не знает, с какой специализацией он был вызван, и поэтому не может передать эти данные в parseAs.

Решение состоит в том, чтобы добавить параметр Class<T> и punt к следующему уровню в цепочке вызовов, где (как мы надеемся) известен конкретный тип:

public <T> execute(Class<T> klass, HttpRequest request) {
   ...
   request.execute().parseAs(klass);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...