![](/img/trans.png)
[英]java warning: Varargs method could cause heap pollution from non-reifiable varargs parameter
[英]Resolve Java method with omitted varargs parameter
我有以下类定义:
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");
类的电话B.foo("hello");
,然后出现编译错误
错误:无法从静态上下文引用非静态方法foo(Object)
当然B.foo("hello", (Object[])null);
正常工作。 但是,如果我将虚拟方法foo重命名为foo1,那么编译错误就消失了。 这意味着静态方法调用的第一个变体仍然有效,但是编译器会首先尝试匹配虚拟签名。 有人可以从Java语言规范文档中提供正确的行为解释吗?
方法解析算法在JLS#15.2.2中定义。 从本质上讲,不包含可变参数的方法优先于具有可变参数的方法(强调我的方法):
第一阶段(第15.12.2.2节)执行重载解析, 而不允许装箱或拆箱转换,也不允许使用可变arity方法调用 。 如果在此阶段未找到适用的方法,则处理将继续进行到第二阶段。
如JLS中所述,这样做是“ 确保与Java SE 5.0之前的Java编程语言版本兼容 ”。
A.foo
不是静态的,而B.foo
是静态的。
调用B.foo("Hello")
是错误的,因为继承的A.foo
方法不是静态的。 您说的电话可能正在显示警告?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.