3

看看这段代码:

public class Test {
public static void main(String... args) {
    flipFlop("hello", new Integer(4), 2004);
    // flipFlop("hello", 10, 2004); // this works!
}

private static void flipFlop(String str, int i, Integer iRef) {
    System.out.println(str + " (String, int, Integer)");
}

private static void flipFlop(String str, int i, int j) {
    System.out.println(str + " (String, int, int)");
}

}

编译器给出调用不明确的错误:

描述资源路径位置类型方法flipFlop(String, int, Integer) 对于Test Test.java scjp19-inheritence/src line 3 Java 问题类型不明确

但是,如果注释掉的行用于调用触发器,则该方法将被明确调用(第二个,因为自动装箱是在使用原语本身之后进行的)。

我希望编译器看到第二个参数将以一种或另一种方式拆箱,并根据第三个参数判断必须调用什么方法。为什么不会发生这种情况?理由是什么?

4

4 回答 4

6

注释行完全匹配flipFlop(String str, int i, int j)。由于自动装箱,另一行匹配两者。

于 2010-03-07T17:12:18.623 回答
1

触发器(“你好”,新整数(4),2004);与 FlipFlop(String str, int i, Integer iRef) 不兼容

于 2010-03-07T17:24:15.407 回答
0

Java 5 及更高版本执行自动装箱(将 Integer 转换为 int)因此结果。

于 2010-03-07T17:44:23.023 回答
-1

是的,根据问题,调用应该取决于 int / Integer @ 3rd 参数之间的差异。 但是,如果第二个参数是自动拆箱的,那么即使是 @ 3rd 参数的差异也很重要。

即使这样也行:flipFlop("hex", new Integer(4), new Integer(17));

虽然符合 syntex 和自动框功能,这应该调用 :: "private static void flipFlop(String str, int i, Integer iRef)" 方法,但它所说的只是 AMBIGUOUS .....??

于 2011-12-31T04:45:24.220 回答