测试类/接口实现的接口?

时间:2011-06-07 00:44:38

标签: java

我想测试类/接口正在实现哪些接口。

所以我有一个基本的接口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界面APermissionsAdapter例如BACA是另一个适配器。 X只是一个示例界面,列表不应包含该界面。

结果:

IB{}
IC{}
IBC{}
ICX{}
IBCX{}

所以它似乎不起作用。现在我在getAdapterInterfaces(A)的错误在哪里?我认为这是测试,但如果一个类是A的特定类,我该如何测试呢?

费边

1 个答案:

答案 0 :(得分:3)

您的测试A.class.isInstance(clazz)错了。它测试接口的类对象是否属于A类型,它不属于ClassObjectSerializableAnnotatedElementGenericDeclarationType(在1.6中),仅此而已。)

我想你想要Class.isAssignableFrom。 (但请阅读文档。)

此外,您可能需要递归到超类和接口,因为可能存在间接实现。