所以我有以下重载方法:
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);
,我会得到“调用int-int”。
但是,如果我将方法(3)改为foo(short a, double b)
,则选择变量arity方法! (Java 7)。
任何人都可以解释一下吗?
答案 0 :(得分:2)
根据规范:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2
“但是,变量arity方法(第8.4.1节)的声明可以更改为给定方法方法调用表达式选择的方法,因为变量arity方法在第一个方法中被视为固定的arity方法相“。
答案 1 :(得分:-3)
您的问题是java中数字推广的典型示例。它试图解决确切的签名匹配(简短,简短),但在您的情况下,您没有这种方法。 Java检查后续兼容数据类型(比如int),它会提升short到int数据类型并尝试查找匹配项,它会找到它。
如果数字促销都不起作用,它将解析为代码中的变量参数方法。
请阅读以下链接中的数字促销活动.. http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html