私はこのようなインターフェースを持っています:
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 つのファイル内の内部インターフェイス)? 必ずしも必要というわけではありません。内部インターフェイスに実装できない理由を知りたいだけです (ただし、内部クラスを拡張することは可能です)。