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

4
在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
}

如Yoni所述,编译结果与预期一致。下面的调用代码也可以编译:

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

如果你运行它,将调用方法#1(即非变参方法)。为什么这个调用代码不会产生歧义?为什么固定参数方法比可变参数方法更具体?有人能指出规范中相关的部分吗?


1
只是好奇...你除了学术兴趣之外,还有特定的理由需要了解吗?(我正在尝试实现运行时分派选择,想知道还有谁在做同样的事情) - Jason S
2个回答

10

第一方法解析阶段仅考虑固定参数数量的方法,如果找到匹配项,则会终止该过程,然后再考虑任何可变参数方法。

来自http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2

15.12.2.2 阶段1:识别适用于子类型的匹配参数数量方法

如果找不到适用于子类型的方法,则继续搜索适用方法,并进入阶段2 (§15.12.2.3)。 否则,在适用于子类型的方法中选择最具体的方法(§15.12.2.5)。

(我的强调.)


谢谢Alex - 我没有看到树林。该死的树! - oxbow_lakes

-1

我无法为您指出规范,但从逻辑上讲,

getSomething(String...args) 

翻译成

getSomething(String[] args)

毫无歧义


是的 - 我理解了。我问的是为什么调用代码不会有歧义 - 我在问题中澄清了我的意图。 - oxbow_lakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接