Mogę zaślepić niektórych ludzi tutaj, ale i tak wystrzelę.Klasa ogólna klasa
wiem, że mogę zrobić:
Class<Response> c = Response.class;
Aby uzyskać klasę obiektu. Zakładając, że obiekt Response jest Response<T>
chcę zrobić coś jak na poniższym
Class<Class<User>> c = Response<User>.class;
moje pełne problemu:
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;
}
}
Ale przede parametru nie została określona w przydziale. Teoretycznie prawidłowy sposób wymagałby:
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();
}
}
Ale to generuje błąd "Nie można wybrać typu sparametryzowanego".
Ewentualnie mogę przekazać w konstruktorze klasy:
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);
[Usunięcie typu] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html) - Nie ma sposobu, aby uzyskać informacje w czasie wykonywania na temat ogólnego parametru typu, ponieważ onn istnieje po kompilacji. Przejście w klasie jawnie jest powszechnym sposobem obejścia tego problemu. – khelwood
Jackson udostępnia tokeny typów. –
Myślę, że nie można przechwytywać ogólnych parametrów w klasie, ale można przechwytywać ogólne parametry w podklasie. Myślę, że może to dotyczyć @SotiriosDelimanolis. – Jason