Methods 抽象方法不指定试图实现超级接口方法的实体接口,因为JDK 8中存在编译时错误
我目前正在尝试学习JDK 8的Methods 抽象方法不指定试图实现超级接口方法的实体接口,因为JDK 8中存在编译时错误,methods,interface,java-8,abstract,implementation,Methods,Interface,Java 8,Abstract,Implementation,我目前正在尝试学习JDK 8的features和它的新特性,即我们可以在接口中实现方法。像这样 interface SuperInt { public static void method1() { // completely qualified System.out.println("method1"); } public default void method2() { // completely qualified Syste
features和它的新特性,即我们可以在接口中实现方法。像这样
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
}
但当我试图扩展这个接口并试图在子接口中实现它时,给出了一个编译时错误
抽象方法不指定主体
如果可以将实现的方法保留在接口中,那么当我们尝试在其子接口中实现超级接口的Abstract方法时,为什么会给出错误
但是当我试图扩展这个接口并在
子接口出现编译时错误
您没有尝试实现它,而是定义了一个新的抽象方法
public void method3() { // compile time error
}
如果要提供实现,请在方法声明前面加上default
关键字:
public default void method3() { // compile time error
...
}
不能在接口中实现抽象方法,并且子int
仍然是接口,而不是类
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
}
}
“正在尝试扩展接口而不是实现它。”我想OP已经知道了,因为他们说“但是当我尝试扩展此接口并尝试实现它时”@Aomine我猜突出显示的部分回答了这个问题。不确定“你不能在接口中实现抽象方法”是什么意思因此,如果我有接口SuperInt{public void method3();}接口SubInt扩展SuperInt{public default void method3(){}
,那么在我的理解中,我会说SubInt
中的“method3”实现了“method3”在SuperInt
@Aomine中,默认的方法不是抽象的
然后。。在您提供的示例中,SubInt
明确定义了method3
(当然被覆盖)的默认实现,以便实现它的类可以使用该默认实现,而从SuperInt派生的类仍然可以选择具有不同的契约。。。。我的意思是,当在一个接口中你没有提供定义方法的分类器时,它会退回到abstract
,因此你无法实现它。因为将方法设为默认值将导致method3()与超级接口完全不同,对吗。。。也许你也不应该放弃一个基本点,即没有接口的实现就不能使用接口。。因此,请理解为,SubInt
的类实现将使用其契约,而SuperInt
的实现将使用其契约。这是可行的,但在类
的情况下不需要default
关键字,对吗?如果说您正在定义一个新的抽象方法,那么您就说明超级接口的method3
不会出现在子接口?@ArunSudhakaran“但是在类的情况下不需要default关键字,对吗?”默认方法只能在接口中使用。当您的类实现一个给定的接口时,它正在签署一个契约,这意味着它将被迫实现所有非默认方法。至于“你说你正在定义一个新的抽象方法,你是在说超级接口的method3没有出现在子接口中?”我说的是“method3”覆盖了SuperInt
中的“method3”。我已经编辑了我的评论。假设我有一个抽象类和一个抽象方法,我正在将它扩展到另一个类中。在新类中,我将实现抽象方法,而不是重写它。我猜给抽象方法下定义是实现
,重新定义超类方法是oveerriding
@ArunSudhakaran正确的。当您为第一级继承实现一个接口时,例如说SuperIntImpl
,您实现了一个抽象方法(implements
)。然后,如果另一个类SubIntImpl扩展了SuperIntImpl
并定义了相同的方法,它将覆盖其实例的实现(@override
)。我猜JDK使用的关键字与它们的用途有一个很好的类比。@ArunSudhakaran也试图在中解释这一点。旁注:接口中定义的方法默认为public
@nullpointer,只是说我给了编译器一点帮助:)编译器甚至没有考虑它们,因为它们是多余的,考虑到从Java9开始,您还可以在接口中定义private
方法,您可能只是对契约进行了明确说明。您只是忘记了在SubInt
中向方法添加default
public class SuperIntImpl implements SuperInt {
@Override
public void method3() {
// must have my own implementation
}
@Override
public void method4() {
// must have my own implementation
}
}