【问题标题】:Why a method with one argument overloaded with arbitrary number of argument version compiles为什么一个参数重载了任意数量的参数版本的方法可以编译
【发布时间】:2013-02-11 17:35:47
【问题描述】:

为什么这个声明在编译时不被认为是模棱两可的?

void f(int a) {
    System.out.println("int");
}
void f(int... a) {
    System.out.println("int...");
}

例如:

f(2);     // to one parameter both method should match (f(int) runs)
f(2,2);   // f(int...)

【问题讨论】:

  • 我现在没有时间找到它,但我敢打赌答案在 JLS section 15.12.2 的某个地方。
  • 好吧,如果编译器可以找到调用的完全匹配,它会去那个,而不是 var-args 甚至装箱。

标签: java


【解决方案1】:

我认为背后的 var-args 声明实际上是由编译器转换为数组的。因此以 var-args 作为参数的方法实际上如下所示:

void f(int[] a) {
    System.out.println("int...");
}

【讨论】:

  • 如果存在类似void f(int[] a)的方法怎么办?
  • @Juvanis,那么它将无法编译。
  • @Juvanis 如果您有一个以数组为参数的方法和另一个以 var-args 为参数的同名方法,则它是编译器错误。模棱两可的方法
  • 是的,var-args 将从参数创建一个数组,但是这并不能解释只有一个参数并且该方法也有一个参数版本时的特殊用例。在哪种情况下,两种方法都可以接受该单个参数。
  • @user1063963 不太明白你的意思,你能详细说明一下吗,可能有一个测试用例示例:)
【解决方案2】:
void f(int... a) {
System.out.println("int...");

}

上述方法可以接受一个或多个值,并且该方法只包含一个参数,即

void f(int a) {
System.out.println("int");

} 也可以接受一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多