我有以下类定义:
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语言规范文档中提供正确的解释吗?
答案 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
方法不是静态的。你说的电话可能会给你一个警告吗?