有沒有方法可以確定對象是否是泛型類型的實例?測試對象是否爲instanceof參數類型
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
這顯然不起作用。有其他選擇嗎?就像我想使用Java反射來實例化一個類,然後檢查以確保它是通用類型T
。
有沒有方法可以確定對象是否是泛型類型的實例?測試對象是否爲instanceof參數類型
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
這顯然不起作用。有其他選擇嗎?就像我想使用Java反射來實例化一個類,然後檢查以確保它是通用類型T
。
,你可以做這種檢查的唯一方法是,如果你有代表型的Class
對象:
Class<T> type; //maybe passed into the method
if (type.isInstance(obj)) {
//...
}
將類型用於參數化Class
類型的限制將會更有意義。當你輸入類型時,不要使用類似Class<?>
的東西,你應該使用Class<? extends T>
。
如果你想知道在運行時的確切類型T的,它要求調用者傳遞一個類
這隻會工作(部分),如果你有一個類型T的對象,然後就可以得到該對象的類,請參閱java.lang.Class<T>
並查找它是否與所討論的對象相同。
但是請注意,這與我們有genrics的原因相反:使用泛型類型是一種說法,您並不在乎它的真實類型(可以指定的上限和下限)。
該類>從非null T實例上的.getClass()調用返回時不保證是類
延長馬克·彼得斯的樣品,經常要像做:
Class<T> type; //maybe passed to the method
if (type.isInstance(obj)) {
T t = type.cast(obj);
// ...
}
你可以試試這個,
// 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....
}
**這不起作用!**對於所有**類型,演員成功。這就是爲什麼它會給出「未經檢查的強制轉換」編譯警告。 – Lii 2018-02-02 08:47:44
如果你不想通過類類型Mark Peters提到的一個參數,你可以使用下面的代碼。榮譽David O'Meara。
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (type.isInstance(obj)) {
...
}
如果你不想把'type'作爲方法參數,也許你想初始化它:'Class type =((T)new Object())。'getClass();' – JordiVilaplana 2016-01-14 00:18:12
@JordiVilaplana這是不對的它會給你java.lang.Object作爲類。檢查此:http://ideone.com/bxt9Jq – 2016-04-13 08:55:58
用途:'類類型=(類)((ParameterizedType)getClass()。getGenericSuperclass())。getActualTypeArguments()[0];' –
2018-02-02 07:58:29