2011-09-15 58 views
0

我有一個IModelElement接口,以及實現該接口的幾個類。在我的代碼中有以下聲明:如何如果給定類型實現一些接口

Object childClass = request.getNewObjectType(); 

這裏getNewObjectType()返回一個Class對象。我需要檢查該Class對象是否代表實現IModelElement接口的類,任何人都知道這是如何實現的?

回答

5

Class.isAssignableFrom(),如果它是一個Class,那麼request.getNewObjectType()應該返回Class,而不是Object。

if (IModelElement.isAssignableFrom((Class) childClass)) { 
    // whatever 
} 
+0

非常感謝......我不能宣佈childClass爲Class然而,作爲request.getNewObjectType()返回對象(有效恢復總是一個類實例與我使用的請求接口的實現,我想基本請求接口聲明該函數返回的對象與任何Class 返回類型兼容,而不使用泛型。如果我更改了使用的請求實現,該怎麼辦?)。感謝您的評論,讓我知道如果我認爲沒有道理,我是一個完整的新手與Java ... – roirodriguez

+0

我不知道我明白你的界面/泛型的問題。如果'getNewObjectType()'總是返回一個Class對象,那麼沒有理由返回Object。您可以像其他任何一樣輕鬆地使用沒有泛型的Class。 –

+0

好的......它仍然是後一個問題(請求接口的實現改變:request是一個返回Object的工廠,實際的實現它總是返回Class對象,所有這些接口和實現都來自外部的API,我不知道是否所有的工廠實現總是返回Class對象...我認爲在if語句中的轉換總是兼容的,但將childClass聲明爲Class可能與工廠實現不兼容返回除Class之外的其他類型的Object, – roirodriguez

0

嘗試:

Object childClass = request.getNewObjectType(); 
if (childClass instanceof Class) { 
    for (Class interfaceClass in ((Class)childClass).getInterfaces()) { 
     if (interfaceClass.getCanonicalName().equals("org.xx.YourInterface")) { 
      // Do some stuff. 
     } 
    } 
} 
+1

我認爲'在'=':'中,這對於簡單的事情來說是一大堆工作,更不用說通過引用接口名稱來丟失一些編譯時類型檢查。 –

1

你可以只是嘗試的request.getNewObjectType()的返回值轉換爲IModelElement。如果沒有ClassCastException,則返回的對象是實現該接口的類。

try { 
    IModelElement temp = (IModelElement) request.getNewObjectType(); 
} catch (ClassCastException e) { 
    // the interface is not implemented 
} 
+0

它可以工作,但在有替代選擇時它不是一個好的解決方案。 CCE是那些例外情況之一,例如NullPointerException,你只是不想捕捉。 –

+0

我同意有更美麗的解決方案 - 不知道'.isAssignableFrom(..)'之前。然而,我不同意,捕捉CCE在每種情況下都是不好的。 – fgysin

+0

你能舉一個很好的使用捕捉CCE的例子嗎? –

相關問題