我正在阅读有关jdk6的令人难以置信的书“java scjp认证程序员指南”,其中有关于泛型覆盖的部分。在上面描述了子签名和等效替代,并描述了我引用的等效替代的一些示例:



我并不完全同意这些方法是重写等效的,实际上,我认为这些方法具有“通过擦除而造成名称冲突”,但没有一个是其他方法的子签名……可能是错误的,因此我希望对此有所了解。

子签名的定义使我认为它们之间没有子签名。

在JSL 6#8.4.2方法签名(http://docs.oracle.com/javase/specs/jls/se6/html/classes.html#8.4.2)中



在JSL 8#8.4.2中。方法签名(http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2)



编辑1

简而言之,我的疑问是,从关于擦除的子签名定义中,我理解
“一个没有删除的签名等于从另一个签名删除”。
“删除后的两个签名都相等” ..其微妙但重要的
(顺便说一句,等效替代定义基于子签名定义,这就是为什么我要问子签名的原因)

最佳答案

TL; DR
我认为这本书的措词在这里并不能很好地融合在一起。按照JLS (8.4.9)的定义,通过否定重写等效性来定义重载(表述:如果存在两个具有相同名称但不等同于重写的方法,则它们将重载)。
但是给出的示例是方法而不是等效的方法,但是 DO 由于其他原因(名称冲突-JLS 8.4.8.3中指定的特定编译时间错误)而导致了编译时错误,因此不会重载。

前言
据我了解,您正在提出有关此句子子句的确切语义的问题:

与结合


您的书暗示这应解释为

(以粗体斜体字添加)。
而您将其解释为

您的解释正确。 我不认为该句子是模棱两可的,因此我认为以第一种方式解释它(即两个签名的擦除是相同的)是不正确的。您可能想要look at this related answer在这里增加我的观点(我发现它也是因为我也想检查我的理解)。

回答(但是...)
您引用的书中的部分实际上是在试图描述重载。
现在-考虑重载时-的JLS (8.4.9) says:

至少从Java 6开始就保持一致。这就是override-equivalent和重载之间的链接的来源。
OK-您的方法将重载,因为它们不是严格等效的。正确的?
错误的。
因为在该部分的上方in 8.4.8.3, the JLS出现了特定的编译时错误:

在您的示例中就是这种情况。在该部分的下面,它阐明了为什么这样做是必要的:

边注
本书中的示例很奇怪,因为Java不允许覆盖静态方法(相反,子类中方法的签名可能会将其隐藏在父类(super class)中)。在我看来,这对于学习者而言,不等于替代的概念有些棘手。但是,您可以删除static并仍然看到他们试图演示的效果。

09-04 18:47
查看更多