【发布时间】:2014-05-12 20:31:28
【问题描述】:
只是说,我的问题的重点是学会理解 jls。我相信jls里的都是真的。
考虑下一个来自 jls 的 sn-p:
8.4.8.1。覆盖(通过实例方法)
在类 C 中声明的实例方法 m1 覆盖另一个实例 方法 m2,在 A 类中声明,当且仅当满足以下所有条件时:
C 是 A 的子类。
m1 的签名是 m2 签名的子签名(第 8.4.2 节)。
要么:
m2 是公共的、受保护的或声明为具有默认访问权限的同一 打包为 C,或
m1 覆盖了一个方法 m3(m3 不同于 m1,m3 不同于 m2), 这样 m3 会覆盖 m2。
此外,如果 m1 不是抽象的,则称 m1 实现了 any 并且 它覆盖的所有抽象方法的声明。
转到子签名声明:
方法 m1 的签名是 a 的签名的子签名 方法 m2,如果:
m2 与 m1 具有相同的签名,或者
m1 的签名与签名的擦除(§4.6)相同 平方米。
关于相同的签名:
两个方法具有相同的签名,如果它们具有相同的名称和 参数类型。
哪条规则允许使用协变返回类型?
【问题讨论】:
-
如果你编辑你的问题解释你为什么认为这是一个矛盾会更好。
-
@Luiggi Mendoza R1,适应于 d2 的类型参数(第 8.4.4 节),是 R2 的子类型。 如果 R1 是 Integer,那么 R2 可能是 Integer 或数字或对象
-
它不兼容 方法 m1 的签名是方法 m2 签名的子签名,如果: m2 与 m1 具有相同的签名,或 m1 的签名与 m2 签名的擦除(第 4.6 节)相同。
-
没错。再说一遍,你有什么不明白的?请注意,方法签名不涉及返回类型。
-
@Luiggi Mendoza 我忘了考虑“如果两个方法具有相同的名称和参数类型,则它们具有相同的签名”的规则。谢谢
标签: java compilation overriding