- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我刚刚转向使用 Java 泛型,所以我不确定我是否在问正确的问题。
我正在尝试使用以下方法:
public <T> ResponseEntity<T> exchange(String url,
HttpMethod method,
HttpEntity<?> requestEntity,
Class<T> responseType,
Object... uriVariables)
throws RestClientException
对于类型 <T>
我提供了Response<MyDTO>
,所以我的方法调用看起来像:
ResponseEntity<Response<MyDTO>> re = exchange(...)
我不知道如何为 Class<T> responseType
提供正确的值参数?
我知道 java 中的泛型会进行类型删除,因此您不应该能够通过反射在运行时确定类型,但我知道我想要提供的确切类型。
我见过很多 How to get a class instance of generics type T 的变体讨论将类类型作为构造函数参数传递。
但我不知道如何创建 Class<Response<MyDTO>>
的实例.
有没有办法做到这一点?还是泛型中有禁止这样做的限制?
最佳答案
Or is there a restriction in generics that prohibits this?
是的。由于类型删除,泛型类型的所有实例共享相同的运行时类,即
new Response<FooDto>().getClass() == new Response<BarDto>().getClass()
因为同一个类对象用于两个类型参数,它的类型不能约束那个参数,即
new Response<FooDto>().getClass()
是类型
Class<? extends Response>
同样,Response<FooDto>.class
不编译,因为没有那个特定类型的类对象,只有一个在所有 Response
之间共享的类对象实例。
理论上,您可以在类对象的类型方面对编译器撒谎:
Class c = Response.class
Class<Response<FooDto>> clazz = (Class<Response<FooDto>>) c
这会编译,但不太可能在运行时执行您想要的操作,因为被调用的方法无法确定 Response
的类型参数.
这给我们留下了两种可能性:API 设计者搞砸了,导致此 API 无法用于您的用例,或者您错误地使用了 API。查找以不同方式接受类型参数值的该方法的重载,并在此处验证您是否确实需要泛型。
关于java - Class<T> 用于 Java 中的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39636894/
我是一名优秀的程序员,十分优秀!