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

第一个方法调用不像我希望的那样工作,第二个方法调用。是否有可能使第一个工作而不显式地将子接口放在不同的文件中并实现超类?因为显然子接口并不是真正的子接口,所以我尝试制作这样的接口类:

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

但显然你不能implements在内部界面中使用。

我的问题是:为什么会这样,有没有办法完成我想要实现的目标(一个文件中的内部接口)?我不一定需要它,我只是想知道为什么不能在内部接口中实现(但可以扩展内部类)。

4

2 回答 2

6

但显然你不能implements在内部界面中使用。

您正在寻找extends而不是implements

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

这为我编译,我当然可以实现这两个接口。

由于在扩展与实施之间似乎存在一些混淆,也许以下内容将有助于澄清问题:

  • 一个接口扩展了另一个接口。
  • 一个类实现一个接口。
  • 一个类扩展了另一个类。
于 2012-12-11T10:49:08.343 回答
1

根据 Java 语言规范:

所以在这里你有两个原因为什么你不能拥有“真正的”内部接口

此外,正如 NPE 所写,一个接口永远不能实现另一个接口,它只能扩展它。类可以实现接口和/或扩展类,接口只能扩展接口。对我来说很有意义。

于 2012-12-11T10:48:59.157 回答