5

所以我有以下重载方法:

private static void foo(short... a)
{
    System.out.println("Calling var-len");
}

private static void foo(int a, int b)
{
    System.out.println("Calling int-int");
}

private static void foo(int a, double b) //(3)
{
    System.out.println("Calling int-double");
}

private static void main (String[] args)
{
    foo((short)2, (short)5); //This one outputs "Calling int-int"
}

我知道变量arity方法在方法解析阶段的优先级最低,所以在这种情况下,如果我打电话foo((short)2, (short)4);,我会得到“Calling int-int”。

但是,如果我将方法 (3) 更改为foo(short a, double b),则选择变量 arity 方法!(Java 7)。谁能解释一下?

4

2 回答 2

2

根据规范:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2

“但是,变量 arity 方法的声明(第 8.4.1 节)可以更改为给定方法方法调用表达式选择的方法,因为变量 arity 方法在第一阶段被视为固定的 arity 方法。”

于 2013-10-25T02:54:14.290 回答
-3

您的问题是 java 中数值提升的典型示例。它尝试解析精确的签名匹配(短,短),但在您的情况下,您没有该方法。Java 检查后续兼容的数据类型(比如 int),它将 short 数据类型提升为 int 数据类型并尝试找到匹配项,然后找到它。

如果数字提升都不起作用,它将解析为代码中的可变参数方法。

请阅读以下链接上的数字促销信息.. http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

于 2013-10-25T03:08:28.537 回答