2011-04-20 28 views
51

有沒有方法可以確定對象是否是泛型類型的實例?測試對象是否爲instanceof參數類型

public <T> test(Object obj) { 
    if (obj instanceof T) { 
     ... 
    } 
} 

這顯然不起作用。有其他選擇嗎?就像我想使用Java反射來實例化一個類,然後檢查以確保它是通用類型T

回答

80

,你可以做這種檢查的唯一方法是,如果你有代表型的Class對象:

Class<T> type; //maybe passed into the method 
if (type.isInstance(obj)) { 
    //... 
} 
+0

如果你不想把'type'作爲方法參數,也許你想初始化它:'Class type =((T)new Object())。'getClass();' – JordiVilaplana 2016-01-14 00:18:12

+4

@JordiVilaplana這是不對的它會給你java.lang.Object作爲類。檢查此:http://ideone.com/bxt9Jq – 2016-04-13 08:55:58

+0

用途:'類類型=(類)((ParameterizedType)getClass()。getGenericSuperclass())。getActualTypeArguments()[0];' – 2018-02-02 07:58:29

3

將類型用於參數化Class類型的限制將會更有意義。當你輸入類型時,不要使用類似Class<?>的東西,你應該使用Class<? extends T>

+1

如果你想知道在運行時的確切類型T的,它要求調用者傳遞一個類是很重要的,而不是一個類。例如,Puce的代碼不能用類進行編譯。 – 2014-05-21 20:38:03

1

這隻會工作(部分),如果你有一個類型T的對象,然後就可以得到該對象的類,請參閱java.lang.Class<T>並查找它是否與所討論的對象相同。

但是請注意,這與我們有genrics的原因相反:使用泛型類型是一種說法,您並不在乎它的真實類型(可以指定的上限和下限)。

+0

該類從非null T實例上的.getClass()調用返回時不保證是類。最好的保證是它是一個類。 – 2014-05-21 20:43:29

12

延長馬克·彼得斯的樣品,經常要像做:

Class<T> type; //maybe passed to the method 
if (type.isInstance(obj)) { 
    T t = type.cast(obj); 
    // ... 
} 
6

你可以試試這個,

// Cast your object to the generic type. 
T data = null; 
try { 
    data = (T) obj; 
} catch (ClassCastException cce) { 
    // Log the error. 
} 

// Check if the cast completed successfully. 
if(data != null) { 
    // whatever.... 
} 
+1

**這不起作用!**對於所有**類型,演員成功。這就是爲什麼它會給出「未經檢查的強制轉換」編譯警告。 – Lii 2018-02-02 08:47:44

1

如果你不想通過類類型Mark Peters提到的一個參數,你可以使用下面的代碼。榮譽David O'Meara。

Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) 
        .getActualTypeArguments()[0]; 
    if (type.isInstance(obj)) { 
     ... 
    }