抽象方法未指定主体-接口试图实现JDK 8中给出编译时错误的超级接口方法

时间:2018-12-01 11:55:19

标签: methods interface java-8 abstract implementation

我目前正在尝试学习JDK 8功能及其新功能,以便我们可以在接口内进行方法的实现。像这样

interface SuperInt {
    public static void method1() {  // completely qualified
        System.out.println("method1");
    }

    public default void method2() {   // completely qualified
        System.out.println("method2");
    }

    public void method3();   // completely qualified
}

但是当我尝试扩展此接口并尝试在子接口中实现它时,会出现编译时错误。

  

抽象方法未指定正文

interface SubInt extends SuperInt {
    public void method3() {  //  compile time error

    }
}

如果可以将实现的方法保留在接口中,那么为什么当我们尝试在其子接口中实现超级接口的绝对方法时却会出错?

2 个答案:

答案 0 :(得分:3)

  

但是当我尝试扩展此接口并尝试在其中实现它时   子接口给出了编译时错误。

您没有尝试实现它,而是在定义一个新的抽象方法。

public void method3() {  //  compile time error

}

如果要提供实现,请在方法声明的前面加上default关键字:

public default void method3() {  //  compile time error
      ...
}

答案 1 :(得分:2)

您无法在interface内实现抽象方法,并且 SubInt仍然是interface而不是class

interface SubInt extends SuperInt

正在尝试 扩展 该接口,并且未实现。要实现它,您应该使用

public class SuperIntImpl implements SuperInt {
    @Override
    public void method3() {

    }
}

另一方面,method2default方法,这就是为什么它与实现一起编译的原因。


相对于SubIntSuperInt的示例,该示例在SubInt中具有默认的重写实现,希望该示例可以澄清一些问题:

public interface SuperInt {
    void method3(); 
    void method4();
}

public interface SubInt extends SuperInt {
    @Override 
    default void method3() { 
        System.out.println("Inside SubInt");
    }
}

虽然SubInt的实现现在可以选择覆盖或不覆盖method3,但仍然必须将method4实现为

public class SubIntImpl implements SubInt {
    @Override
    public void method4() {

    }
    // can reuse the implementation of the 'method3'
}

,对于SuperInt的任何实现,仍然必须同时拥有method3method4的实现

public class SuperIntImpl implements SuperInt {

    @Override
    public void method3() {
         // must have my own implementation
    }

    @Override
    public void method4() {
        // must have my own implementation
    }
}