超类方法和接口默认方法冲突解决
考虑下面的例子,
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中的一个错误 。
但在假设之前,是否在JLS中定义并记录了此行为? 或者还有其他什么来定义这种行为?
编辑:Eclipse版本是Mars Release(4.5.0) ,如果重要的话。
您的假设是正确的,从超类inheritance的具体方法优先于interface
的default
方法:
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中的一个错误