gpt4 book ai didi

java - 重载可变参数方法时的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 01:45:16 25 4
gpt4 key购买 nike

通常,具有固定数量参数的方法优于具有可变数量参数的重载方法。但是,此示例的行为有所不同:

public class Main{
public static void main(String[] args){
print(1);
print(1,2);
print(new String[]{"a","b"});
print(new String[][]{{"a","b"},{"c","d"}});
}

public static void print(Object object){
System.out.println("single argument method");
System.out.println(object);
}

public static void print(Object object0,Object object1){
System.out.println("two argument method");
System.out.println(object0);
System.out.println(object1);
}

public static void print(Object... objects){
System.out.println("varargs method with "+objects.length+" arguments");
for(Object object : objects){
System.out.println(object);
}
}
}

输出:

single argument method
1
two argument method
1
2
varargs method with 2 arguments
a
b
varargs method with 2 arguments
[Ljava.lang.String;@5e2de80c
[Ljava.lang.String;@1d44bcfa

第三行main使用一个参数调用该方法,该参数是具有两个元素的 String[]。但这不会执行带有一个参数的方法,而是执行 varargs 方法,并且就像我给它两个参数一样(这很正常,因为它是一个数组)。

现在的问题是:这种情况应该发生吗?我是否发现了错误或未记录的行为?它这样做有什么原因吗?

为什么我要这样做:我想创建一个打印到控制台的快捷方式,它既可以接受任意数量的参数(对于多行),也可以以一种很好的方式打印数组和列表。

最佳答案

Should this happen?

是的

Have I found a bug or undocumented behaviour?

没有

Is there a reason why it does this?

是的。 From Oracle :

It is still true that multiple arguments must be passed in an array, but the varargs feature automates and hides the process. Furthermore, it is upward compatible with preexisting APIs.

当您显式使用数组时,它仍然与 varargs 签名匹配。这样做是为了让人们可以轻松地将数组参数切换为可变参数,而不会破坏现有的集成点。

这与 main 可以是 String[]String... 的原因完全相同

关于java - 重载可变参数方法时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53763434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com