java - 为什么在 Java 中不允许用 Foo(Object[]) 重载 Foo(Object...)?

标签 java methods parameters arguments language-specifications

我想知道为什么在 Java 中不允许用 Foo(Object... args) 重载 Foo(Object[] args),尽管它们被使用以不同的方式?

Foo(Object[] args){}

用法如下:

Foo(new Object[]{new Object(), new Object()});

而另一种形式:

Foo(Object... args){}

用法如下:

Foo(new Object(), new Object());

这背后有什么原因吗?

最佳答案

15.12.2.5 Choosing the Most Specific Method谈论这个,但它很复杂。例如在 Foo(Number... ints) 和 Foo(Integer... ints) 之间进行选择

为了向后兼容,这些实际上是同一件事。

public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}

// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});

例如您可以将 main() 定义为

public static void main(String... args) {

使它们不同的一种方法是在可变参数之前采用一个参数

public Foo(Object o, Object... os){} 

public Foo(Object[] os) {}

Foo(new Object(), new Object()); // calls the first.

Foo(new Object[]{new Object(), new Object()}); // calls the second.

它们并不完全相同。细微差别在于,虽然您可以将数组传递给可变参数,但您不能将数组参数视为可变参数。

public Foo(Object... os){} 

public Bar(Object[] os) {}

Foo(new Object[]{new Object(), new Object()}); // compiles fine.

Bar(new Object(), new Object()); // Fails to compile.

此外,可变参数必须是最后一个参数。

public Foo(Object... os, int i){} // fails to compile.

public Bar(Object[] os, int i) {} // compiles ok.

关于java - 为什么在 Java 中不允许用 Foo(Object[]) 重载 Foo(Object...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838339/

相关文章:

java - 安卓/Java。 AsyncTask/Thread 在我需要时将数据传递回 UI(不仅在执行前/执行后)

javascript - 如何检测JS参数是否有多余的文本?

java - 将 int[][] 作为通用参数传递

javascript - 函数剩余参数抛出错误

parameters - 关于在mybatis中传递表名作为参数

java - 表达式的赋值 - 编译或运行时现象

java - JacksonMapper 反序列化空值

Java通配符具有 super 意外的行为

methods - 为什么在Golang中给结构体添加方法时一定要声明变量名?

java - 方法和最终修饰符