oxb*_*kes 4 java variadic-functions jls
在Java语言规范的第15.12.2.5节中,它讨论了如何在具有固定arity的方法和可变arity方法(即varargs
)中选择最具体的方法.
我在JLS中找不到的是关于两个方法之间的决定,其中一个是固定的arity,另一个是变量arity.例如:
public interface SomeApi {
public String getSomething(String arg); // method 1
public String getSomething(String ... args); // method 2
}
Run Code Online (Sandbox Code Playgroud)
按照人们的预期编译就好(由Yoni概述的原因如下).这个调用代码也编译:
SomeApi api = ...
Object o = api.getSomething("Hello");
Run Code Online (Sandbox Code Playgroud)
如果你运行它,method #1
(即非varargs方法)被调用.为什么这个调用代码没有含糊不清?为什么固定arity方法比变量arity方法更具体?有人能指出我对规范的相关部分吗?
ale*_*exh 10
第一个方法解析阶段仅考虑固定的arity方法,如果在找到任何varargs方法之前找到匹配,则终止该过程.
来自http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2
15.12.2.2阶段1:确定子类型适用的匹配Arity方法
如果找不到子类型适用的方法,则继续第2阶段(第15.12.2.3节)搜索适用的方法.否则,在子类型适用的方法中选择最具体的方法(第15.12.2.5节).
(我的重点.)