5

私はこのようなインターフェースを持っています:

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 はあまり興味深いものではありません。実装する空のクラスです。SuperInterface.SubInterface

そして、メインのこの作品:

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

最初のメソッド呼び出しは期待どおりに機能しませんが、2 つ目は機能します。サブインターフェースを別のファイルに明示的に配置してスーパークラスを実装せずに、最初のものを機能させることは可能ですか? どうやらサブインターフェイスは実際には subinterfaces ではないため、次のように Interface クラスを作成しようとしました。

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

implementsしかし、明らかに内部インターフェースでは使用できません。

私の質問は次のとおりです。それはなぜですか。また、達成したいことを達成する方法はありますか (1 つのファイル内の内部インターフェイス)? 必ずしも必要というわけではありません。内部インターフェイスに実装できない理由を知りたいだけです (ただし、内部クラスを拡張することは可能です)。

4

2 に答える 2

6

implementsしかし、明らかに内部インターフェースでは使用できません。

あなたが探しているのextendsimplements

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

これは私のためにコンパイルされ、両方のインターフェースを確実に実装できます。

拡張と実装に関して混乱があるように見えるため、おそらく次のことが問題を解決するのに役立ちます。

  • インターフェイス別のインターフェイスを拡張します。
  • クラスはインターフェースを実装します。
  • クラス別のクラスを拡張します。
于 2012-12-11T10:49:08.343 に答える
1

Java 言語仕様によると:

したがって、「実際の」内部インターフェースを使用できない理由は 2 つあります。

また、NPE が書いているように、インターフェイスは別のインターフェイスを実装することはできず、それを拡張することしかできません。クラスはインターフェースを実装および/またはクラスを拡張できます。インターフェースはインターフェースのみを拡張できます。私には完全に理にかなっています。

于 2012-12-11T10:48:59.157 に答える