为什么我会得到“模棱两可”的编译错误重载方法,例如f(int ... arg)和f(Integer ... arg)?

时间:2018-11-30 10:49:03

标签: java variadic-functions

为什么我会得到“模棱两可”的编译错误重载方法,例如void f(int... arg)void f(Integer... arg)

我知道根据JLS,参数解析分为三个步骤(只有在上一步没有结果的情况下,才进行下一步):

  1. 原始(如果完全匹配失败,则扩大)
  2. 装箱(如果完全匹配失败,则扩大参考范围)
  3. varargs(执行步骤1和2,但要使用varargs)

问题1:因此,当涉及到第三步(varargs)时,它会尝试同时使用步骤1和步骤2转换为vararg(现在,它们均等地尝试,没有优先级),并且如果可以有2个签名,则为暧昧。我认为vararg检查应该在int停止...并且在步骤1匹配后再也不要尝试拳击。

问题2:void f(int arg)void f(long arg)永远不会出现“含糊不清”的错误,因此在一个步骤(此处为步骤1)之内,“完全匹配”和“加宽”就不会产生竞争-完全匹配编译器不会尝试进行加宽(在匹配原始vararg之后也尝试装箱并匹配装箱的vararg时取消第三个vararg步骤)

0 个答案:

没有答案