anu*_*amD 3 java variadic-functions language-lawyer overload-resolution
在这段代码中,为什么编译器无法从静态上下文引用具有 varargs 参数的方法。
private static void doSomething(int... nums) {
System.out.println("1");
}
private void doSomething(int num1, int num2) {
System.out.println("2");
}
public static void main(String[] args) {
doSomething(1,2);
}
Run Code Online (Sandbox Code Playgroud)
JDK 17 正在抱怨Cannot make a static reference to the non-static method doSomething(int, int) 。这是一个错误还是我不知道的其他功能。
JDK 8 和 JDK 11 不要抱怨它!
拒绝方法调用的行为是正确的。方法解析应该首先找到最具体的方法,然后检查修饰符static。
javac但是7到16版本有一个bug 。
看
\n\n\nJavac 与 JLS 16 规范的 \xc2\xa715.12.3 部分不同步。特别是,对于静态上下文中的调用,javac 过早检查该方法是否是静态的,当它确定它不是静态且无法调用时,将继续进行方法查找的下一阶段,即使它应该报告编译时错误。
\n
此错误已通过 JDK\xc2\xa017 修复。
\n请注意,Eclipse\xe2\x80\x99s 编译器 ECJ 没有此错误,因此无论您使用哪个 JDK 版本,该示例在 Eclipse 中都会被拒绝。
\n只有使用简单名称的调用才会受到影响。当您使用 时ClassName.doSomething(1,2);,所有版本都会解析调用doSomething(int num1, int num2)并生成正确的错误。
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |