解析省略了varargs参数的Java方法

解析省略了varargs参数的Java方法,java,Java,我有以下类别定义: class A { String foo(Object par) { return par.toString(); } } class B extends A { static String foo(String par, Object ... pars) { return par.toString(); } } 如果我打B.foohello;,这样的电话,然后我得到一个编译错误 错误:无法从静态上下文引用非静态方法对象 当然,B.foohhello

我有以下类别定义:

class A {
String foo(Object par) {
     return par.toString();
  }
}
class B extends A {
 static String foo(String par, Object ... pars) {
   return par.toString();
 }
}
如果我打B.foohello;,这样的电话,然后我得到一个编译错误

错误:无法从静态上下文引用非静态方法对象

当然,B.foohhello,Object[]null;工作正常。但是,如果我将虚拟方法foo重命名为foo1,那么编译错误就会消失。这意味着静态方法调用的第一个变量仍然有效,但编译器会首先尝试匹配虚拟签名。有人能从Java语言规范文档中正确解释该行为吗

A.foo不是静态的,而B.foo是静态的

调用B.foohhello是一个错误,因为继承的A.foo方法不是静态的。您所说的正在工作的调用可能会向您显示警告?

a.foo不是静态的,而B.foo是静态的


调用B.foohhello是一个错误,因为继承的A.foo方法不是静态的。您说正在工作的调用可能会向您显示警告?

方法解析算法在中定义。实质上,没有varargs的方法优先于有varargs的方法:

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


如JLS中所述,这样做是为了确保与Java SE 5.0之前的Java编程语言版本兼容。

方法解析算法在中定义。实质上,没有varargs的方法优先于有varargs的方法:

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


正如JLS中所解释的,这样做是为了确保与Java SE 5.0之前的Java编程语言版本兼容。

事实上,如果我通过删除varargs部分来更改静态方法签名,静态方法解析就不会出现问题。然而,我仍然希望看到一个例子,为什么它可能是向后兼容性的问题。事实上,如果我通过删除varargs部分来更改静态方法签名,静态方法解析就不会出现问题。然而,我仍然希望看到一个例子,说明为什么它可能是向后兼容性的问题。