为什么在方法重载的上下文中参数的顺序被视为方法签名的一部分?

Why is the order of parameters considered part of a method's signature in context of method overloading?

在此代码中...

public class Person {
    
    public void walk(String alpha, int beta) {}
    
    public void walk(int beta, String alpha) {}
}

...我只是改变了参数的顺序,但它仍然被认为是方法重载,即编译时的静态绑定。我的问题是:

  1. 为什么在 Java 中将顺序视为方法签名的一部分?
  2. 有什么优势?从我的视角来看,我没有看到这样做的确切优势。

参数的顺序有所不同,因为它是不同的签名。想象一下你有一个人类签名并改变了字母的顺序,它将不再是相同的签名。

如果我们以我的用户名为例,RStevoUK 与 UKRStevo 完全不同。

您介绍的案例有什么优势吗?编号

我不建议使用具有相同名称和相同参数的方法,但只是乱七八糟,因为这样做没有任何意义。您将实现的只是调用错误方法的可能性(如果它们都有不同的方法体)和混淆,就像您所建议的那样。

因为“先吃午饭后慢跑”和“先慢跑后出发”,只是顺序不同,是两种不同的模式。

在Java中,我们有一个Method Overloading的概念,也就是说,在一个class中,你可以定义同名的方法,只要它们签名会有所不同。

现在让我们将上面的“jogging/lunch”示例重新表述为更正式的和 Java 相关的概念:

当您有重载方法时,JVM 需要某种方式来了解要调用哪个特定的重载方法,使用标识多个 方法的名称;它知道,由于方法参数的类型、数量和顺序

仅类型是不够的信息,因为如果 Java 取消匹配参数及其各自参数的顺序,将不清楚调用哪个特定方法。

假设您定义了 foo(int a, char b)foo(char a, int b),然后您在某处调用了 .foo([...])。您如何看待,基于 什么 编译器应该决定为这段代码编译哪个方法调用? (编译器不会让你通过,如果你违反签名); 此外 - JVM 应该如何进行绑定,稍后,在运行时,当 foo 被调用时,但至少有两个方法,用相同的名称定义?

为此,方法具有 signatures,其中参数的顺序表现出不同的模式,使 Java 机器能够继续进行正确和适当的绑定和调用。

另外,想想 varargs,在假设的场景中,参数的顺序无关紧要。

你认为:

foo(String... a, String b)

foo(String b, String... a)

会一样吗?

如果你这样做,那你就错了。

用外行的话来说,解析输入模式变得困难 - 有多少输入字符串文字,第一个签名的方法,应该考虑接受,作为数组参数,在它的第一个参数中(只有第一个文字?前两个?..多少?数组在哪里结束?),以及哪个字符串参数,特别是应该被接受到第二个参数 (更深入的解释,见 this);因此,您将遇到编译时错误:

error: varargs parameter must be the last parameter

而在第二种情况下,不管调用此方法时使用多少 stringfirst 参数将始终被绑定到第一个参数,其余的将构成一个数组,作为参数传递给第二个参数。