在抽象类中接口

时间:2014-04-11 09:18:48

标签: java interface abstract-class inner-classes jls

是否可以在抽象类中声明一个接口?我试过这个,我成功地做到了没有任何编译错误?在实际使用中,这有什么意义吗?

这是我写的代码。

public abstract class X 
{
   public interface abc extends I1 
   {
        public void sum(int i,int j);
   }
}


  public class Impl extends X 
  {
    class InnerImpl implements abc
   {
        @Override
        public int sum(int i, int j)
        {
          return i+j;
        }
   }
 }



public interface I1 
{
}

2 个答案:

答案 0 :(得分:2)

您可以在任何类中声明一个接口,而不仅仅是抽象。该接口隐式static,因此您的封闭类只提供命名空间作用域,否则与接口无关。

这种效用肯定存在,我已经在很多场合使用过它。通常,接口耦合到同一类的方法,因此客户端可以将该接口的实现传递给该方法。

使用Java 8和功能接口类型,本地接口的扩散只会增加。

答案 1 :(得分:0)

是的,这是可能的。正如你所说 - 它编译(我想象运行),所以它是合法的 事实上,在接口或枚举中声明子接口是合法的(但只有公共接口,因为私有接口在接口中没有任何意义,就像私有方法一样)。

至于实际用途: 您可以在抽象类中声明一个私有内部类,并在所述抽象类的方法中使用它(我希望您能想到它的用法)。或者其中两个。如果您需要两者的共享合同 - 您可以使用界面。或者你需要返回一个在父类之外没有意义的特定事物。

一个更实际的例子是界面Map及其子界面Map.EntryMap返回Entry的一些方法,但没有Map,条目无意义,因此不是独立的接口。如果Map是一个抽象类而不是一个接口,那么你将完全具备你所描述的情况。