2012-12-11 8 views
5

は、私はこのようなインターフェイスを持っている:Javaジェネリック:内部インターフェイスが(内部)スーパーインターフェイスから実装できないのはなぜですか?

public interface SuperInterface { 
    public interface SubInterface { 
     public void get(); 
    } 
    //**More interfaces*/ 

} 

特定のクラスのインスタンスであるすべてのオブジェクト取得の私のツールキット、この方法:

public static <T> ArrayList<T> getSome(ArrayList<Object> objects, Class<T> clazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (Object o : objects) 
     if (clazz.isInstance(o)) 
      result.add(clazz.cast(o)); 
    return result; 
} 

MyClassのは本当に面白いではないが、その空

ArrayList<Object> mObjects = new ArrayList<Object>() { 
    { 
     add(new MyClass()); //SuperInterface.SubInterface 
     add(Integer.valueOf(5)); 
     add(new String("Hello")); 
     add(new Object()); 
    } 
}; 
ArrayList<SuperInterface> mSuperInterfaces = Toolkit.getSome(mObjects, SuperInterface.class); //returns a zero-sized list. 
ArrayList<SuperInterface.SubInterface> mSubInterfaces = Toolkit.getSome(mObjects, SuperInterface.SubInterface.class); //returns a one-sized list 
0: SuperInterface.SubInterface

そしてメインで、この作品から実装するクラス

私が望むように最初のメソッド呼び出しはうまくいかず、2番目のメソッド呼び出しはうまくいきません。サブファイルを明示的に別のファイルに置いてスーパークラスを実装せずに、最初のサブセットを実行することは可能ですか? ので明らかにサブインターフェイスは本当にをサブインターフェイス、ので、私はこのようなインターフェイスクラスを作ってみましたではありません。

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub implements Super { /**...*/ } 
} 

しかし、どうやらあなたは内部インターフェイスでimplementsを使用することはできません。

私の質問は:なぜそれがなのですか?達成したいことを達成する方法がありますか?私は必ずしもそれを必要としません、なぜ私は内部のインターフェイスで実装することはできません(まだ内部クラスを拡張することは可能です)知ってほしいです。 Java言語仕様によると

答えて

6

しかし、明らかに内部インターフェイスにimplementsを使用することはできません。あなたはextendsではなく、implementsを探している

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub extends Super { /**...*/ } 
} 

これは私のためにコンパイルし、私は確かに両方のインターフェイスを実装することができます。実装対拡張周りにいくつかの混乱があるように見えるので、おそらく次のように明確に物事を助ける

  • インタフェース他のインターフェイスを拡張します。
  • クラスは、インターフェイスを実装しています。
  • クラスは、のクラスを拡張します。
+0

いつインターフェイスから拡張できますか?私は、キーワードが実装され、抽象クラスとインタフェースを区別するためにそこに拡張すると思った? – stealthjong

+2

@ChristiaandeJong:インタフェースは常に他のインタフェースを拡張し*ます*実装していません。クラスだけが物を実装できます。 – NPE

+0

あなたはそれに言及したので、実際はかなり論理的です。どうもありがとう。 – stealthjong

1

だからここにあなたが "本物" の内側のインターフェイスも

を持つことができない理由は二つの理由がありますNPEが書いているように、インタフェースは決して別のインタフェースを実装することはできません。クラスはインターフェイスを実装したりクラスを拡張したりすることができます。インターフェイスはインターフェイスのみを拡張できます。私には理にかなっている。

関連する問題