In this piece of code, why the compiler is not able to reference the method that has varargs argument from static context.

 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);
}

JDK 17正在抱怨Cannot make a static reference to the non-static method doSomething(int, int) .这是一个bug还是另一个我不知道的特性.

JDK 8和JDK 11不要对此抱怨!

推荐答案

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

但从版本7到16,javac中有一个bug.

看见

JDK-8268474, Method resolution should stop on static error

Javac与JLS 16规范第§15.12.3节不同步.特别是,对于静态上下文中的调用,javac过早地判断方法是否是静态的,当它确定它不是静态的并且不能被调用时,就进入方法查找的进一步阶段,即使它应该报告编译时错误.

JDK 17已修复此错误.

请注意,Eclipse的编译器ECJ没有这个bug,因此在Eclipse中,无论使用哪个JDK版本,都会拒绝该示例.

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

Java相关问答推荐

如何使用Spring Data从MongoDB文档中包含的数组中 Select 单个元素?

无法运行Java(已解决)

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

转换为Biggram

嵌入式ActiveMQ Artemis Web控制台加载错误

Spring data JPA/Hibernate根据id获取一个列值

测试何时使用Mockito强制转换对象会导致ClassCastException

如何使用Jackson将XML元素与值和属性一起封装

用户填充的数组列表永不结束循环

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

支持MySQL 5.6的最新Hibernate版本

当构造函数创建一个新实例时,Java为什么需要&new";

如何在不作为类出现的表上执行原生查询?

如何对存储为字符串的大数字数组进行排序?

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

不能在 map 上移除折线

具有多个分析模式的复杂分隔字符串的正则表达式

无限递归Java问题

Java 21保护模式的穷尽性