[英]Determine the type of a generic class at Runtime
我知道以下事實:該網站充滿類似的問題,並且通過快速閱讀給定的問題,想到的第一個答案是“不,你不能”,但我仍然給我印象是絕不是不可能的。
我在一個類中創建了一個通用方法,我想檢查傳遞給該方法的Object的類型。 我知道它不能直接完成,因此我將對象Class<T>
obj傳遞給該方法。 但是我找不到方法主體中正確執行類型檢查的方法。
public <T> void readData(T obj1, Class<T> obj2){
}
假定T
始終是以下三種類型之一: ClassA
, ClassB
或ClassC
。 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.