4

Java Language Specification 的第 15.12.2.5 节中,它讨论了如何在具有固定数量的方法和可变数量的方法(即varargs)的两种情况下选择最具体的方法。

我在 JLS 中找不到任何关于在两种方法之间做出决定的方法,其中一种方法是固定参数,另一种方法是可变参数。例如:

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(即非可变参数方法)被调用。为什么这个调用代码没有歧义?为什么固定数量的方法比可变数量的方法更具体?有人可以指出规范的相关部分吗?

4

2 回答 2

10

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

来自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)。

(我的重点。)

于 2009-08-24T11:32:48.450 回答
-1

我不能指出你的规范,但从逻辑上讲,

getSomething(String...args) 

翻译成

getSomething(String[] args)

毫不含糊

于 2009-08-24T10:51:02.217 回答