在Java中,为什么调用foo()没有给定2个varags方法foo(int ... ints)和foo(Object ... objects)?

mik*_*kej 10 java variadic-functions ambiguous

如果我只声明2个varargs方法如下:

public void foo(String... strings) {
    System.out.println("Foo with Strings");
}
Run Code Online (Sandbox Code Playgroud)

public void foo(int... ints) {
    System.out.println("Foo with ints");
}
Run Code Online (Sandbox Code Playgroud)

然后有代码:

foo();
Run Code Online (Sandbox Code Playgroud)

由于预期的模糊性,这是编译器错误.

但是,如果我只有以下2个版本的foo:

public void foo(Object... objects) {
    System.out.println("Foo with Objects");
}
Run Code Online (Sandbox Code Playgroud)

public void foo(int... ints) {
    System.out.println("Foo with ints");
}
Run Code Online (Sandbox Code Playgroud)

那么代码

foo();
Run Code Online (Sandbox Code Playgroud)

调用方法的int版本.任何人都可以解释为什么第二个例子不是同样含糊不清,为什么它解析为Object方法的int方法.谢谢.

Per*_*ega 29

如果我从准备scjp时正确回忆起来,在第一种情况下你有2个参数,它们之间没有关系,所以编译器不能选择一个.

在第二种情况下,启用装箱(1.5+),int可以是Integer,它是Object的子集,如果发生冲突,编译器将始终使用最具体的定义.所以整数(int)是优先的.

  • 这是对的.来自JLS ... 15.12.2.5选择最具体的方法http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 (6认同)