具有固定/可变arity(varargs)匹配的最具体方法

时间:2009-08-24 10:47:17

标签: java variadic-functions jls

section 15.12.2.5 of the Java Language Specification中,它讨论了如何在具有固定arity的方法和可变arity方法(即 varargs )的两种情况下选择最具体的方法。 / p>

我在JLS中找不到的是关于两个方法之间的决定,其中一个是固定arity而另一个是变量arity 。例如:

public interface SomeApi {
    public String getSomething(String arg);       // method 1
    public String getSomething(String ... args);  // method 2
}

按照人们的预期编译得很好(由于Yoni在下面列出的原因)。这个调用代码也编译:

SomeApi api = ...
Object o = api.getSomething("Hello");

如果你运行它,则调用method #1(即非varargs方法)。为什么这个调用代码不含糊?为什么固定arity方法比变量arity方法更具体?有人能指出我对规范的相关部分吗?

2 个答案:

答案 0 :(得分: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节)   适用的方法之一   通过子类型。

(我的重点。)

答案 1 :(得分:-1)

我不能指出你的规格,但逻辑上,

getSomething(String...args) 

转换为

getSomething(String[] args)

没有歧义