当前位置: 首页 > 面试题库 >

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

江建明
2023-03-14
问题内容

在Java语言规范的15.12.2.5节中,它讨论了如何在具有固定arity的方法和可变arity的方法(即
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(即non-
varargs方法)将被调用。为什么此调用代码不明确?为什么固定变量法比可变变量法更具体?有人可以指出我相关规范吗?


问题答案:

第一个方法解析阶段仅考虑固定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节)。

(我的重点。)



 类似资料:
  • 问题内容: 有人可以帮助我了解JLS第15.12.2.5节“ re:最具体的方法” 吗? (来自JLS的糟糕的剪切和粘贴如下) 此外,如果满足以下任一条件,则一个名为m的可变arity成员方法比具有相同名称的另一可变arity成员方法更具体: 一个成员方法具有n个参数,另一个具有k个参数,其中n> = k。第一种成员方法的参数类型为T1,…。。。,Tn-1,Tn [],另一种方法的参数类型为U1,

  • 我正在使用带有静态编程语言的android持久性库。 Dao看起来像这样 这对我来说似乎很好,但我得到了这个错误 错误:查询中的每个绑定变量必须有一个匹配的方法参数。找不到:countryId的方法参数 我可以看到参数被命名为,那么可能是什么问题呢? 仅供参考:这是CountryDao_I生成的代码mpl.java 在这种方法中,我看到arg0在方法中的任何地方都没有使用。 编辑:这似乎在新插件中

  • 我正在homedepot.com练习,现在我有这样的问题卡住了,错误信息是:“Arity不匹配:步骤定义'StepsTestCase.SearchShoppingStep.click文件中的_close_button_in_add_to_cart_window(WebDriver):/C:/用户/管理员/git/MavenProject/目标/类/'带有模式[^在添加到购物车窗口中单击关闭按钮$]

  • ab、bc、cd、ef、fg、gh、ij、jk、kl、mn、no、op 现在,在匹配时,我希望为单词标记定制最小匹配。 我的意思是,默认情况下,当与单词对应的任何一个令牌与索引文档匹配时,mm=1,该索引文档将被返回。如果我给MM=2,那么任何2个单词中的任何一个标记都需要匹配要返回的索引文档。

  • 示例代码: import org.javia.arity.Symbols; import org.javia.arity.SyntaxException; public class TryArity {     public static void main(String args[]) throws SyntaxException {         Symbols symbols = new

  • If set to true, mac and dos newlines (\r and \r\n) in config files are converted to \n when they are parsed. true by default. 如果该变量设为真,那么在配置文件中的mac 和 dos 换行符(\r and \r\n)在语法解析时将会转换为\n. 默认情况下,该变量为真.