3

誰かがなぜtest()合格しtestInheritance()ないのか説明できますか?

public class IPanDeviceEnclosedClassesTest {

    public static interface Root {
       class Enclosed {}
    }

    public static interface Leaf extends Root {}

    @Test
    public void testInheritance() {
        Class<?> enclosing  = Leaf.class;
        Class<?>[] enclosed = enclosing.getClasses();
        assertNotEquals(0, enclosed.length);
    }

    @Test
    public void test() {
        Class<?> enclosing  = Root.class;
        Class<?>[] enclosed = enclosing.getClasses(); // getDeclaredClasses() works as well
        assertNotEquals(0, enclosed.length);
    }
}
4

1 に答える 1

3

答えは、getClasses javadocの強調表示されたビットにあります。

この Class オブジェクトによって表されるクラスのメンバーであるすべてのパブリック クラスおよびインターフェイスを表す Class オブジェクトを含む配列を返します。これには、スーパークラスから継承されたパブリック クラスおよびインターフェイス メンバーと、クラスによって宣言されたパブリック クラスおよびインターフェイス メンバーが含まれます。

私が知るgetClasses()限り、スーパークラスから継承したクラスとそのスーパークラスの静的クラスを返します。インターフェースはスーパークラスではないため、javadoc によると、インターフェースで宣言された静的クラスが返されるとは考えるべきではありません。

次の継承テストのうち、合格するだけtestInheritanceClassesです。

1) スーパークラスを拡張するクラスは、以下を参照しEnclosedます。

public static class RootClass {
      public static class Enclosed {}
}

public static class LeafClass extends RootClass {}

@Test
public void testInheritanceClasses() {
    Class<?> enclosing  = LeafClass.class;
    Class<?>[] enclosed = enclosing.getClasses();
    System.out.println(Arrays.deepToString(enclosed));
    Assert.assertNotEquals(0, enclosed.length);
}

2) インターフェースを「拡張」するインターフェースが見えないEnclosed

public interface Root {
    class Enclosed {}
}

public interface Leaf extends Root {}

@Test
public void testInheritanceInterfaces() {
     Class<?> enclosing  = Leaf.class;
     Class<?>[] enclosed = enclosing.getClasses();
     System.out.println(Arrays.deepToString(enclosed));
     Assert.assertNotEquals(0, enclosed.length);
}

3) インターフェースを実装するクラスは、以下を認識しませんEnclosed:

public interface Root {
    class Enclosed {}
} 

public static class LeafImplementingRoot implements Root {}        


@Test
public void testInheritanceImplements() {
    Class<?> enclosing  = LeafImplementingRoot.class;
    Class<?>[] enclosed = enclosing.getClasses();
    System.out.println(Arrays.deepToString(enclosed));
    Assert.assertNotEquals(0, enclosed.length);
}
于 2013-09-09T14:26:20.797 に答える