2013-02-28 64 views
0

我知道這個網站充滿了類似的問題,通過快速閱讀給定的問題,想到的第一個答案是「不,你不能「,但我仍然有這樣的印象:我所要求的並不是不可能的。在運行時確定一個通用類的類型

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

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

假設T總是以下三種類型:ClassAClassBClassC。 if-else-if塊應該如何?

+2

我猜w如果(obj1 instanceof ClassA){...} if(obj1 instanceof ClassB){...} .... – 2013-02-28 14:20:50

+0

您可以隨時執行obj1.getClass()。getSimpleName()。equals()爲obj2),從而知道他們的名字是否相等,否則我不明白爲什麼發送*兩個*參數。 – Infested 2013-02-28 14:25:38

+0

@LuiggiMendoza是對的。在這種情況下,你甚至不需要obj2。 – Pace 2013-02-28 14:26:01

回答

0

使用obj2.cast(obj1),其投射obj1obj2表示的類或接口,返回obj1如果obj1是可分配給類型T(注意null可分配任何類型的),並拋出ClassCastException否則。

我們不感興趣的結果中投,因爲obj1靜態已知類型已Tobj2.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 
//... 
}