具有固定/可变arity(varargs)匹配的最具体方法
在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");
如果你运行它,则调用method #1
(即非varargs方法)。 为什么这个调用代码不含糊? 为什么固定arity方法比变量arnt方法更具体? 有人能指出我对规范的相关部分吗?
第一个方法解析阶段仅考虑固定的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)
毫不含糊
- 如何将时间戳从yyyy-MM-ddThh:mm:ss:SSSZ格式转换为MM / dd / yyyy hh:mm:ss.SSS格式? 从ISO8601到UTC
- AES 256位加密 – java.security.InvalidAlgorithmParameterException:错误的IV长度:必须是16个字节长
- Java中的最终字符
- 如何改善JAVA swing GUI的外观和感觉?
- 如何在java中的Event Dispatch Thread队列的开头插入一个事件?
- 使用Netbeans自动最大化窗口
- 在Java中从COM7端口读取图像数据
- 为什么这个HashMap.get返回null?
- sql查询中的外来/重音字符