2011-06-07 84 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