java - 使用省略的 varargs 参数解析 Java 方法

标签 java

我有以下类定义:

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 语言规范文档中的行为提供正确的解释吗?

最佳答案

方法解析算法在JLS #15.2.2中定义.实际上,没有可变参数的方法优先于有可变参数的方法(强调我的):

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

如 JLS 中所述,这样做是为了“确保与 Java SE 5.0 之前的 Java 编程语言版本的兼容性”。

关于java - 使用省略的 varargs 参数解析 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33933533/

相关文章:

java - 将 List<Object> 转换为 List<String> 而不使用 for?

java - 如何在 Mongo 中正确设置 JsonNode 但没有像在 Java 中使用 Jackson 的 String 那样设置它?

从 Web 服务器下载文件时出现 java.lang.IllegalStateException servlet 异常

java - 使用腻子时出现"Error: Invalid port number"

Java 对数时钟给出不准确的答案

java - 为什么我的 JFrame 之一无法打开/显示在外部 jar 文件上?

java - 使用 Java 创建一个递归函数,打印列表中包含的所有可能的项目序列。

Java字符比较错误

java - 在java中为各种用户定义的类创建通用方法

java - 如何实际选择一个 JButton