我有一个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