gpt4 book ai didi

Java 方法重载和可变参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:10 26 4
gpt4 key购买 nike

我正在尝试了解方法重载,并且我有这些方法。

public void method(int a){
System.out.println("int a");
}

//implementing interface method
@Override
public void method() {
System.out.println("interface");
}

//varargs
public void method(int ... a){
System.out.println("int ... a");
}

用这些参数调用它们之后,

int[] a = new int[5];
stack.method();
stack.method(1);
stack.method(5,6);
stack.method(null);
stack.method(a);

我有这些结果:

interface
int a
int ... a
int ... a
int ... a

据我所知,由于歧义,该程序不应该编译,但它还是编译了。编译器不应该抛出错误吗?

最佳答案

Eran 和 Bathsheba 已经说过为什么不同的人不使用 null被选中。

剩下的问题是:为什么 stack.method(null);甚至编译?

答案是它匹配可变参数签名,因为可变参数 method(int...)从编译器的角度来看,实际上与 method(int[]) 相同.由于数组由引用引用,null可以在 int[] 的地方使用预计。

所以:

stack.method();

method() 完全匹配界面中的签名。与 method(int...) 没有歧义因为仅当其他参数不匹配时才会考虑可变参数。

stack.method(1);

匹配method(int) .出于与上述相同的原因,没有歧义。

stack.method(5,6);

匹配method(int...)因为没有一个非可变参数匹配,但可变参数匹配。

stack.method(null);

参见前面的解释。

stack.method(a);

匹配match(int...)同理method(null0确实:因为 match(int...)实际上与 match(int[]) 相同给编译器。

关于Java 方法重载和可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38541597/

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