gpt4 book ai didi

java - 使用可变参数重载函数

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:34 25 4
gpt4 key购买 nike

这不会编译:

public class Methods
{

public static void method(Integer... i)
{
System.out.print("A");
}

public static void method(int... i)
{
System.out.print("B");
}

public static void main(String args[])
{
method(7);
}
}

这将编译并工作:

public class Methods
{

public static void method(Integer i)
{
System.out.print("A");
}

public static void method(int i)
{
System.out.print("B");
}

public static void main(String args[])
{
method(7);
}
}

第一个和第二个例子非常相似。首先使用可变参数,其次不使用。为什么一个有效,第二个无效。 7 是原始的,因此在两种情况下都应调用第二种方法。这是正常行为吗?

我找到了: Bug report Stack overflow

最佳答案

这是对正在发生的事情的高级非正式摘要。

首先,varargs 语法实际上只是传递数组的语法糖。所以 method(7) 实际上是要传递一个数组......一些东西。

但是什么数组?这里有两个选项对应方法的两个重载;即 int[]Integer[]

如果有两个或多个重载可以工作(即正确的方法名称、正确的参数数量、可转换的值),那么解析过程将选择完全匹配的重载而不是需要转换的匹配,如果唯一的候选人需要转换。 (这是对规则的极大简化……完整故事请参见 JLS section 15.12……并准备好阅读冗长/困难的内容!)

那么在您的第一个示例中发生的事情是它试图在两种都需要转换的方法之间做出决定;即 intint[]intInteger[]。基本上它无法决定使用哪个替代方案。因此会出现一个编译错误,指出 调用 不明确。

如果您将可变参数调用更改为传递显式 Integer[]int[] 的调用,您现在将获得与两个重载之一的精确匹配。 .. 上面的规则说这不是模棱两可的。


I understand it as: 7 is primitive so it should be converted to array - int[].

问题是 7 也可以 转换为 Integer[] ... 通过自动装箱 int 首先。

关于java - 使用可变参数重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692950/

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