超类方法和接口默认方法冲突解决

考虑下面的例子,

public class Testing extends SupCls implements Intf { public static void main(String[] args) { new Testing().test(); } } class SupCls { public void test() { System.out.println("From SupCls"); } } interface Intf { public default void test() { System.out.println("From Intf"); } } 

如您所见, SupCls类和Intf接口之间没有任何关联。 但两者都定义了一种常用方法。

Testing类正在扩展SupCls并实现Intf

所以,当我在Testing输出上调用test()方法时,

 From SupCls 

我认为这是有道理的,因为从类扩展应该比从接口实现更高的优先级。

但是eclipse报告不然,如下面的屏幕截图所示。

Eclipse的屏幕截图

我坚信这是Eclipse中的一个错误

但在假设之前,是否在JLS中定义并记录了此行为? 或者还有其他什么来定义这种行为?

编辑:Eclipse版本是Mars Release(4.5.0) ,如果重要的话。

您的假设是正确的,从超类inheritance的具体方法优先于interfacedefault方法:

JLS§8.4.8。 inheritance,压倒和隐藏

C inheritance自其直接超类和直接超接口所有abstract和默认(§9.4)方法m ,其中所有以下都是真的:

  • C中声明的方法没有签名是m的签名的子签名(第8.4.2节)。
  • C从其直接超类inheritance的具体方法没有签名,该签名是m的签名的子签名。

第二个引用的子弹适用于此处,有一个具有适当签名的直接超类inheritance的具体方法,因此default方法不会被inheritance。

该文档甚至可以通过额外的评论清除任何疑问:

请注意,inheritance的具体方法可能会阻止抽象或默认方法的inheritance。 (稍后我们将声明具体方法覆盖了“来自C”的抽象或默认方法。)

因此,当涉及到类Testing时,它就像SupCls.test()会覆盖Intf.test()

换句话说,你是对的,这是Eclipse中的一个错误,但只要它只影响提案的呈现方式,我认为这是一个错误。 无论D是否已在提案中呈现,插入的源都是相同的。

这当然是eclipse中的一个错误,但是在代码完成提议中而不是在编译器中。 将鼠标hover在测试或打开声明的调用上,将转到SupCls方法并正确运行代码,打印“From SupCls”,certificate了这一点。 请提交针对jdt ui的错误进行调查

看起来像eclipse版本很重要!

在Eclipse Luna(4.4.1)中,参考指向SupCls而不是Intf

在此处输入图像描述

可能是Eclipse Mars中的一个错误