使用普通签名而不是varargs是Java的标准行为吗?

使用普通签名而不是varargs是Java的标准行为吗?,java,Java,我有下一节课: public class Matrix implements ITensor { public double get(int row, int column) { return mData[row][column]; } @Override public double get(int... indices) { return get(indices[0], indices[1]); } } 因此get(

我有下一节课:

public class Matrix implements ITensor {

    public double get(int row, int column) {
        return mData[row][column];
    }

    @Override
    public double get(int... indices) {
        return get(indices[0], indices[1]);
    }
}
因此
get(r,c)
适用于这两种签名,Java会调用第一个声明吗(当然,我可以检查它是否是标准行为)?在这种情况下,JVM如何选择方法签名

p.S.这似乎是个无关紧要的问题,但我自己找不到信息

TL;DR永远不会选择varargs方法而不是非varargs方法

见JLS:

确定适用性的过程始于确定潜在适用的方法(§15.12.2.1)。然后,为了确保与Java SE 5.0之前的Java编程语言兼容,该过程分三个阶段继续:

  • 第一阶段执行重载解析,不允许装箱或拆箱转换,也不允许使用变量算术方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段

    这保证了在Java SE 5.0之前的Java编程语言中有效的任何调用都不会因为引入变量arity方法、隐式装箱和/或取消装箱而被认为是不明确的。然而,变量arity方法的声明(§8.4.1)可能会改变为给定方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为固定arity方法。例如,在已经声明了m(对象)的类中声明m(对象…)会导致不再为某些调用表达式(例如m(null))选择m(对象),因为m(对象[])更具体

  • 第二阶段执行重载解析,同时允许装箱和取消装箱,但仍然禁止使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段

    这确保了如果方法通过固定arity方法调用适用,则永远不会通过变量arity方法调用选择该方法

  • 第三阶段允许重载与变量arity方法、装箱和拆箱相结合

  • TL;DR永远不会选择varargs方法而不是非varargs方法

    见JLS:

    确定适用性的过程始于确定潜在适用的方法(§15.12.2.1)。然后,为了确保与Java SE 5.0之前的Java编程语言兼容,该过程分三个阶段继续:

  • 第一阶段执行重载解析,不允许装箱或拆箱转换,也不允许使用变量算术方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段

    这保证了在Java SE 5.0之前的Java编程语言中有效的任何调用都不会因为引入变量arity方法、隐式装箱和/或取消装箱而被认为是不明确的。然而,变量arity方法的声明(§8.4.1)可能会改变为给定方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为固定arity方法。例如,在已经声明了m(对象)的类中声明m(对象…)会导致不再为某些调用表达式(例如m(null))选择m(对象),因为m(对象[])更具体

  • 第二阶段执行重载解析,同时允许装箱和取消装箱,但仍然禁止使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段

    这确保了如果方法通过固定arity方法调用适用,则永远不会通过变量arity方法调用选择该方法

  • 第三阶段允许重载与变量arity方法、装箱和拆箱相结合