簡體   English   中英

Java中的泛型類<T>?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM