2011-09-15 56 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的例子吗? –

相关问题