我目前正在尝试学习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
}
}
如果可以将实现的方法保留在接口中,那么为什么当我们尝试在其子接口中实现超级接口的绝对方法时却会出错?
答案 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() {
}
}
另一方面,method2
是default
方法,这就是为什么它与实现一起编译的原因。
相对于SubInt
和SuperInt
的示例,该示例在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
的任何实现,仍然必须同时拥有method3
和method4
的实现
public class SuperIntImpl implements SuperInt {
@Override
public void method3() {
// must have my own implementation
}
@Override
public void method4() {
// must have my own implementation
}
}