使用省略的varargs参数

时间:2015-11-26 08:16:40

标签: 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.foo("hello");那样进行调用,那么我会收到编译错误

错误:无法从静态上下文引用非静态方法foo(Object)

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

2 个答案:

答案 0 :(得分:5)

方法解析算法在JLS #15.2.2中定义。实质上,没有varargs的方法优先于具有varargs的方法(强调我的):

  

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

正如JLS中所解释的那样,它以“”的方式完成,以确保与Java SE 5.0之前的Java编程语言版本兼容

答案 1 :(得分:0)

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

调用B.foo("Hello")是一个错误,因为继承的A.foo方法不是静态的。你说的电话可能会给你一个警告吗?