gpt4 book ai didi

java - Class 用于 Java 中的泛型?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:04 25 4
gpt4 key购买 nike

我刚刚转向使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com