foo(int, int) 被选择为 foo(int...)

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 不要抱怨它!

Hol*_*ger 5

拒绝方法调用的行为是正确的。方法解析应该首先找到最具体的方法,然后检查修饰符static

\n

javac但是7到16版本有一个bug 。

\n

\n

JDK-8268474,方法解析应因静态错误而停止

\n
\n

Javac 与 JLS 16 规范的 \xc2\xa715.12.3 部分不同步。特别是,对于静态上下文中的调用,javac 过早检查该方法是否是静态的,当它确定它不是静态且无法调用时,将继续进行方法查找的下一阶段,即使它应该报告编译时错误。

\n
\n

此错误已通过 JDK\xc2\xa017 修复。

\n

请注意,Eclipse\xe2\x80\x99s 编译器 ECJ 没有此错误,因此无论您使用哪个 JDK 版本,该示例在 Eclipse 中都会被拒绝。

\n

只有使用简单名称的调用才会受到影响。当您使用 时ClassName.doSomething(1,2);,所有版本都会解析调用doSomething(int num1, int num2)并生成正确的错误。

\n