我有一個IModelElement接口,以及實現該接口的幾個類。在我的代碼中有以下聲明:如何如果給定類型實現一些接口
Object childClass = request.getNewObjectType();
這裏getNewObjectType()返回一個Class對象。我需要檢查該Class對象是否代表實現IModelElement接口的類,任何人都知道這是如何實現的?
我有一個IModelElement接口,以及實現該接口的幾個類。在我的代碼中有以下聲明:如何如果給定類型實現一些接口
Object childClass = request.getNewObjectType();
這裏getNewObjectType()返回一個Class對象。我需要檢查該Class對象是否代表實現IModelElement接口的類,任何人都知道這是如何實現的?
Class.isAssignableFrom(),如果它是一個Class,那麼request.getNewObjectType()
應該返回Class,而不是Object。
if (IModelElement.isAssignableFrom((Class) childClass)) {
// whatever
}
使用的instanceof操作?
if(childClass instanceof Class) {
(Class) child = (Class) childClass;
child.method();
}
http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
問題不在於childClass是否是Class實例,而是該類是否實現已知的接口 –
嘗試:
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.
}
}
}
我認爲'在'=':'中,這對於簡單的事情來說是一大堆工作,更不用說通過引用接口名稱來丟失一些編譯時類型檢查。 –
你可以只是嘗試的request.getNewObjectType()
的返回值轉換爲IModelElement
。如果沒有ClassCastException,則返回的對象是實現該接口的類。
try {
IModelElement temp = (IModelElement) request.getNewObjectType();
} catch (ClassCastException e) {
// the interface is not implemented
}
它可以工作,但在有替代選擇時它不是一個好的解決方案。 CCE是那些例外情況之一,例如NullPointerException,你只是不想捕捉。 –
我同意有更美麗的解決方案 - 不知道'.isAssignableFrom(..)'之前。然而,我不同意,捕捉CCE在每種情況下都是不好的。 – fgysin
你能舉一個很好的使用捕捉CCE的例子嗎? –
非常感謝......我不能宣佈childClass爲Class然而,作爲request.getNewObjectType()返回對象(有效恢復總是一個類實例與我使用的請求接口的實現,我想基本請求接口聲明該函數返回的對象與任何Class 返回類型兼容,而不使用泛型。如果我更改了使用的請求實現,該怎麼辦?)。感謝您的評論,讓我知道如果我認爲沒有道理,我是一個完整的新手與Java ... –
roirodriguez
我不知道我明白你的界面/泛型的問題。如果'getNewObjectType()'總是返回一個Class對象,那麼沒有理由返回Object。您可以像其他任何一樣輕鬆地使用沒有泛型的Class。 –
好的......它仍然是後一個問題(請求接口的實現改變:request是一個返回Object的工廠,實際的實現它總是返回Class對象,所有這些接口和實現都來自外部的API,我不知道是否所有的工廠實現總是返回Class對象...我認爲在if語句中的轉換總是兼容的,但將childClass聲明爲Class可能與工廠實現不兼容返回除Class之外的其他類型的Object, – roirodriguez