JavaSE7规范8.4.9中关于重载的混乱措辞

JavaSE7规范8.4.9中关于重载的混乱措辞,java,overloading,Java,Overloading,这里,我引用Java SE 7规范8.4.9中的第一行: 如果一个类的两个方法(无论是在同一个类中声明的,还是都由一个类继承的,或者一个声明的和一个继承的)具有相同的名称,但签名不是重写等价的,则称该方法名为重载 因此,任何不符合重写等价条件的内容都被称为重载 但下面示例中的两种方法既不等同于重写,也不能被认为对重载有效 public String my_method(int x) {.....} public int my_method(int x) {.....} 重写无效,因为其中一

这里,我引用Java SE 7规范8.4.9中的第一行:

如果一个类的两个方法(无论是在同一个类中声明的,还是都由一个类继承的,或者一个声明的和一个继承的)具有相同的名称,但签名不是重写等价的,则称该方法名为重载

因此,任何不符合重写等价条件的内容都被称为重载

但下面示例中的两种方法既不等同于重写,也不能被认为对重载有效

public String my_method(int x) {.....} 
public int my_method(int x) {.....} 
重写无效,因为其中一个的返回类型不是另一个返回的子类

对于重载无效,因为单独使用不同的返回类型不足以将两个方法视为重载


对8.4.9有何评论?也许我在感知中遗漏了一些东西。

您遗漏的是方法的返回类型不是其签名的一部分

8.4.2中覆盖等效物的定义如下:

“如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。”

请注意,定义中没有提到返回类型

然后它说:

方法m1的签名是方法m2签名的子签名,如果:

  • m2与m1具有相同的签名,或[…]
当m1是m2的子签名或m2是m1的子签名时,两个方法签名m1和m2是覆盖等价的

因此,具有相同名称和相同参数类型但结果类型不同的两个方法是等效的

最后8.4.2说:

“在类中声明两个具有重写等效签名的方法是编译时错误。”

因此,如果方法在同一个类中,那么示例代码是非法的


另一方面,如果一个方法位于包含另一个方法的类的子类中,那么根据8.4.5中的规则,两个方法都不能用另一个方法替换返回类型。。。因此,这也是一个编译错误。

缺少的是方法的返回类型不是其签名的一部分

8.4.2中覆盖等效物的定义如下:

“如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。”

请注意,定义中没有提到返回类型

然后它说:

方法m1的签名是方法m2签名的子签名,如果:

  • m2与m1具有相同的签名,或[…]
当m1是m2的子签名或m2是m1的子签名时,两个方法签名m1和m2是覆盖等价的

因此,具有相同名称和相同参数类型但结果类型不同的两个方法是等效的

最后8.4.2说:

“在类中声明两个具有重写等效签名的方法是编译时错误。”

因此,如果方法在同一个类中,那么示例代码是非法的


另一方面,如果一个方法位于包含另一个方法的类的子类中,那么根据8.4.5中的规则,两个方法都不能用另一个方法替换返回类型。。。因此,这也是一个编译错误。

缺少的是方法的返回类型不是其签名的一部分

8.4.2中覆盖等效物的定义如下:

“如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。”

请注意,定义中没有提到返回类型

然后它说:

方法m1的签名是方法m2签名的子签名,如果:

  • m2与m1具有相同的签名,或[…]
当m1是m2的子签名或m2是m1的子签名时,两个方法签名m1和m2是覆盖等价的

因此,具有相同名称和相同参数类型但结果类型不同的两个方法是等效的

最后8.4.2说:

“在类中声明两个具有重写等效签名的方法是编译时错误。”

因此,如果方法在同一个类中,那么示例代码是非法的


另一方面,如果一个方法位于包含另一个方法的类的子类中,那么根据8.4.5中的规则,两个方法都不能用另一个方法替换返回类型。。。因此,这也是一个编译错误。

缺少的是方法的返回类型不是其签名的一部分

8.4.2中覆盖等效物的定义如下:

“如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。”

请注意,定义中没有提到返回类型

然后它说:

方法m1的签名是方法m2签名的子签名,如果:

  • m2与m1具有相同的签名,或[…]
当m1是m2的子签名或m2是m1的子签名时,两个方法签名m1和m2是覆盖等价的

因此,具有相同名称和相同参数类型但结果类型不同的两个方法是等效的

最后8.4.2说:

“在类中声明两个具有重写等效签名的方法是编译时错误。”

因此,如果方法在同一个类中,那么示例代码是非法的


另一方面,如果一个方法位于包含另一个方法的类的子类中,那么根据8.4.5中的规则,两个方法都不能用另一个方法替换返回类型。。。因此,这也可能是一个编译错误。

来自其他两个部分的以下信息解决了您的问题:

在一个类中声明两个具有重写等效签名的方法是编译时错误