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

StackOverflow https://stackoverflow.com/questions/951388

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

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();

调用该方法的整数版本。任何人都可以解释为什么第二个示例没有类似的歧义以及为什么它解析为 int 方法而不是 Object 方法。谢谢。

有帮助吗?

解决方案

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

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

其他提示

Java将始终使用最接近类型的可能,所以,当你通过整数到方法,如果你没有足够的INT ...方法,它会autobox他们到整数和使用的对象....既然有一个int ...方法,Java将首先使用。这是在Java编译器设计选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top