2011-06-07 58 views
2

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

所以我有一个基本的接口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的特定班级?

Fabian

回答

3

您的测试A.class.isInstance(clazz)是错误的。它测试接口的类对象是否为A类型,它不是(它的类型为Class,Object,Serializable,AnnotatedElement,GenericDeclarationType(在1.6中),仅此而已)。

你想Class.isAssignableFrom,我想。 (但是,阅读文档。)

此外,您可能需要改乘超类和接口,因为有可能是间接的实现。

+0

啊谢谢!现在它工作正常。 – xZise 2011-06-07 00:55:53