Java语言规范的第15.12.2.5节, ,它讨论了如何在两种具有固定ARITY和可变方法的方法的方法中选择最特定的方法(即 varargs).

我在JLS中找不到的是在两种方法之间决定 一个是固定的,是可变的 然而。例如:

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

正如人们所期望的那样,编译好的(由于下面概述的原因)。此调用代码还编译:

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

如果您运行它, method #1 (即非varargs方法)被调用。为什么这个呼叫代码不模棱两可?为什么固定的ARITY方法比变量 - 元素更具体?有人可以将我指向规格的相关位吗?

有帮助吗?

解决方案

第一个方法分辨率阶段仅考虑固定的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)将在通过亚型适用的方法中选择。

(我的重点。)

其他提示

我不能指向您的规格,但是从逻辑上讲,

getSomething(String...args) 

转换为

getSomething(String[] args)

没有歧义

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top