Java泛型:为什么内部接口不能从(内部)超接口实现?

时间:2012-12-11 10:45:20

标签: java generics inheritance interface

我有这样的界面:

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

}

我的Toolkit中的这个方法,它检索作为某个类的实例的所有对象:

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

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

2 个答案:

答案 0 :(得分:6)

  

但显然你不能在内部接口中使用implements

您正在寻找extends而不是implements

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

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

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

  • 接口扩展另一个接口。
  • 实现接口。
  • 扩展另一个类。

答案 1 :(得分:1)

根据Java语言规范:

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

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