I've just moved over to using Java generics, so I'm not sure if I'm even asking the right question.
I am trying to make use of the following method:
public <T> ResponseEntity<T> exchange(String url,
HttpMethod method,
HttpEntity<?> requestEntity,
Class<T> responseType,
Object... uriVariables)
throws RestClientException
For type <T> I have provided Response<MyDTO>, so my method call looks like:
ResponseEntity<Response<MyDTO>> re = exchange(...)
I cannot work out how to provide the correct value to the Class<T> responseType parameter?
I do know that generics in java undergo type erasure so you shouldn't be able to determine types at runtime via reflection, but I know the exact type I want to provide.
I have seen many variations of How to get a class instance of generics type T that talk about passing the class type as a constructor parameter.
But I cannot work out how to make an instance of Class<Response<MyDTO>>.
Is there a way to do this? Or is there a restriction in generics that prohibits this?
Or is there a restriction in generics that prohibits this?
Yes. Due to type erasure, all instances of a generic type share the same runtime class, i.e.
new Response<FooDto>().getClass() == new Response<BarDto>().getClass()
Because the same class object is used for both type parameters, its type can not constrain that parameter, i.e.
new Response<FooDto>().getClass()
is of type
Class<? extends Response>
Likewise, Response<FooDto>.class does not compile, because there is no class object for that particular type, only a class object shared among all Response instances.
Theoretically, you could lie to the compiler about the type of the class object:
Class c = Response.class
Class<Response<FooDto>> clazz = (Class<Response<FooDto>>) c
which would compile, but is very unlikely to do what you want at runtime, because the called method would be unable to determine the type parameter of Response.
This leaves us with two possibilites: Either the API designer screwed up and made this API unusable for your use case, or you are using the API wrong. Look for an overload of that method that accepts the value of the type parameter in a different way, and verify that you really need generics here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With