簡體   English   中英

在運行時確定泛型類的類型

[英]Determine the type of a generic class at Runtime

我知道以下事實:該網站充滿類似的問題,並且通過快速閱讀給定的問題,想到的第一個答案是“不,你不能”,但我仍然給我印象是絕不是不可能的。

我在一個類中創建了一個通用方法,我想檢查傳遞給該方法的Object的類型。 我知道它不能直接完成,因此我將對象Class<T> obj傳遞給該方法。 但是我找不到方法主體中正確執行類型檢查的方法。

public <T> void readData(T obj1, Class<T> obj2){
}   

假定T始終是以下三種類型之一: ClassAClassBClassC if-else-if塊應如何顯示?

使用obj2.cast(obj1) ,它將obj1轉換為obj2表示的類或接口,如果obj1可分配給類型T (請注意null可以分配給任何類型),則返回obj1 ,否則拋出ClassCastException

我們對obj2.cast(obj1)==obj1結果不感興趣,因為靜態已知的obj1類型已經是T並且obj2.cast(obj1)==obj1 (如果obj2.cast(obj1)==obj1成功)。 但是,如果強制轉換失敗,則會引發早期異常。

例:

public <T> void readData(T obj1, Class<T> obj2){
 obj2.cast(obj1); 
 //... 
}   

以下調用(從Class<?>Class<String>的未經檢查的強制轉換)將失敗:

readData("Hello",(Class<String>)(Class<?>)Integer.class);

該方法cast也是更換選中鑄件,比如有用:

public <T> void readData(Object obj1, Class<T> obj2){
 T t = (T)obj1;//BAD: unchecked cast
 //...
}


public <T> void readData(Object obj1, Class<T> obj2){
 T t = obj2.cast(obj1());//GOOD: ClassCastException if the cast fails
 //...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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