10

如果我只声明 2 个可变参数方法,如下所示:

public void foo(String... strings) {
    System.out.println("Foo with Strings");
}

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

然后有代码:

foo();

由于预期的歧义,这是一个编译器错误。

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

public void foo(Object... objects) {
    System.out.println("Foo with Objects");
}

public void foo(int... ints) {
    System.out.println("Foo with ints");
}

然后代码

foo();

调用方法的 ints 版本。谁能解释为什么第二个示例不是同样模棱两可,以及为什么它解析为 int 方法而不是 Object 方法。谢谢。

4

2 回答 2

29

如果我在准备 scjp 时记得正确,在第一种情况下,您有 2 个参数,它们之间没有关系,因此编译器无法选择一个。

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

于 2009-06-04T15:49:34.767 回答
4

Java 将始终尽可能使用最接近的类型,因此当您将 int 传递给方法时,如果您没有 int... 方法,它会将它们自动装箱为 Integers 并使用 Object...。因为有一个 int。 .. 方法,Java 将首先使用它。这是 Java 编译器设计中的一个选择。

于 2009-06-04T15:50:42.817 回答