Я мог бы ослепить некоторых людей здесь, но я все равно выстрелю.Класс общего класса
Я знаю, что я могу сделать:
Class<Response> c = Response.class;
Чтобы получить класс объекта. Если предположить, что объект ответа Response<T>
я хочу сделать что-то вроде следующего
Class<Class<User>> c = Response<User>.class;
Моей полной проблемы:
public class RequestHelper<T> extends AsyncTask<String, Response, T> {
@Override
protected T doInBackground(String... strings) {
...
Response <T> r = objectMapper.readValue(result, Response.class);
return r .getResponse();
}
}
//and
public class Response <R> {
private R response;
public R getResponse() {
return response;
}
}
Но выше параметра не указан в задании. Теоретически правильный способ требует:
public class RequestHelper<T> extends AsyncTask<String, Response, T> {
@Override
protected T doInBackground(String... strings) {
...
Response <T> r = objectMapper.readValue(result, Response <T>.class);
return r.getResponse();
}
}
Но что генерирует ошибку пуха «не удается выбрать из параметризованного типа».
В качестве альтернативы я мог бы передать класс в конструкторе:
public class RequestHelper<T> extends AsyncTask<String, Response, T> {
....
public RequestHelper(Class<Class<T>> tClass){
this.tClass = tclass;
}
@Override
protected T doInBackground(String... strings) {
...
Response <T> r = objectMapper.readValue(result, tclass);
return r.getResponse();
}
}
// where the init of the class would have been:
new RequestHelper<User>(Response<User>.class);
[Тип стирания] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html). Невозможно получить информацию во время выполнения о параметре общего типа, потому что это не так. после компиляции. Прохождение в классе явно является обходным решением. – khelwood
Джексон предоставляет типы токенов для этого. –
Я думаю, что вы не можете захватить общие параметры внутри класса, но вы можете захватить общие параметры в подклассе. Я думаю, что это может быть то, о чем говорит @SotiriosDelimanolis. – Jason