我想测试类/接口正在实现哪些接口。
所以我有一个基本的接口Adapter
和一些基于它的接口(例如PermissionsAdapter
)。现在我得到一个类型为Adapter
的变量,现在我希望得到这个变量正在实现的基于Adapter
的每个接口。
一个简单的实现:
import java.util.LinkedList;
import java.util.List;
public class Main {
private interface A { }
private interface BA extends A { }
private interface CA extends A { }
private interface X {}
private class IB implements BA { }
private class IC implements CA { }
private class IBC implements BA, CA { }
private class ICX implements CA, X { }
private class IBCX implements BA, CA, X {}
public Main() {
this.test(new IB());
this.test(new IC());
this.test(new IBC());
this.test(new ICX());
this.test(new IBCX());
}
private void test(A a) {
List<Class<? extends A>> result = this.getAdapterInterfaces(a);
System.out.print(a.getClass().getSimpleName() + "{");
for (Class<? extends A> class1 : result) {
System.out.print(class1.getSimpleName() + ", ");
}
System.out.println("}");
}
@SuppressWarnings("unchecked")
public List<Class<? extends A>> getAdapterInterfaces(A adapter) {
List<Class<? extends A>> result = new LinkedList<Class<? extends A>>();
Class<?>[] interfaces = adapter.getClass().getInterfaces();
for (Class<?> clazz : interfaces) {
if (A.class.isInstance(clazz)) {
result.add((Class<? extends A>) clazz);
}
}
return result;
}
public static void main(String[] args) {
new Main();
}
}
以下Adapter
界面A
和PermissionsAdapter
例如BA
和CA
是另一个适配器。 X
只是一个示例界面,列表不应包含该界面。
结果:
IB{}
IC{}
IBC{}
ICX{}
IBCX{}
所以它似乎不起作用。现在我在getAdapterInterfaces(A)
的错误在哪里?我认为这是测试,但如果一个类是A
的特定类,我该如何测试呢?
费边
答案 0 :(得分:3)
您的测试A.class.isInstance(clazz)
错了。它测试接口的类对象是否属于A
类型,它不属于Class
,Object
,Serializable
,AnnotatedElement
,GenericDeclaration
和Type
(在1.6中),仅此而已。)
我想你想要Class.isAssignableFrom
。 (但请阅读文档。)
此外,您可能需要递归到超类和接口,因为可能存在间接实现。