- java/
- 使用普通签名而不是varargs是Java的标准行为吗?
使用普通签名而不是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方法、装箱和拆箱相结合