[英]Class<T> for a generic in Java?
我剛剛轉向使用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中的泛型經歷了類型擦除,因此您不能通過反射在運行時確定類型,但我知道我想要提供的確切類型。
我已經看到了如何獲取泛型類型T的類實例的許多變體,它們討論了將類類型作為構造函數參數傳遞。
但我無法弄清楚如何創建Class<Response<MyDTO>>
的實例。
有沒有辦法做到這一點? 或者是否有限制泛型的限制?
Response<whatever>
的類是Response.class
。 但是,要告訴編譯器您希望它是Response<MyDTO>
的類,特別是您必須Response<MyDTO>
轉換它:( (Class<Response<MyDTO>>) (Object) Response.class
。 如果演員陣容讓你覺得可疑......好吧,這是一件可疑的事情。
這將如預期是,如果該參數用於創建的新實例Response
, 也不需要創建的新實例MyDTO
(例如,用戶應該調用后將其設置exchange
)。 但我想不出任何其他情況。
或者是否有限制泛型的限制?
是。 由於類型擦除,泛型類型的所有實例共享相同的運行時類,即
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錯誤。 查找該方法的重載,以不同的方式接受type參數的值,並驗證您確實需要泛型。
出於某種原因,采用Response<MyDTO>
實例並使用getClass()
的常用方法無法編譯:
Response<MyDTO> response = new Response<MyDTO>(...);
Class<Response<MyDTO>> clazz = response.getClass();
正如@meriton所提到的,它導致cannot convert from Class<capture#1-of ? extends Response> to Class<Response<MyDTO>>
cannot convert from Class<capture#1-of ? extends Response> to Class<Response<MyDTO>>
。
PS:期望Class作為參數是非常不尋常的,我想知道他們需要什么。
PPS:我測試了它,@ AlexeyRomanov和我的解決方案似乎都沒有產生“generified”類:
import java.util.ArrayList;
class Main
{
public static void main (String [] args)
{
System.out.println((Class<ArrayList<String>>)(Object)(ArrayList.class));
System.out.println((new ArrayList<String>()).getClass());
}
}
產量
class java.util.ArrayList
class java.util.ArrayList
似乎兩種泛型類型都丟失了。 如果這不僅僅是Class.toString的問題,只需使用Response.class
就可以得到相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.