当前位置: 首页 > 面试题库 >

叫哪个方法?(整数... a)vs.(整数a,整数b)

楚嘉纳
2023-03-14
问题内容

我刚刚发现了一个非常有趣的Java技巧:

void method1(Integer... a){
}

因此,您可以根据需要为该方法提供尽可能多的整数。

现在,如果我有一个类似的(重载)方法,例如:

void method1(int a, int b){

}

当我执行以下行时,运行哪种方法:

method1(1, 2);

好吧,我可以通过使用不同的方法指令进行测试来轻松地发现这一点,但是当我考虑“重载”方法中的“规则”时,我必须确保每个重载的方法都必须相同,以便编译器知道确切地使用哪个。

我认为,上面的代码不起作用,因为应该混淆编译器。但是,当我尝试它时,它会起作用。

所以..有人知道这方面的更多背景信息吗?


问题答案:

为了确定应调用哪种方法,编译器会遍历以下列表,如JLS#5.3和JLS#15.12.2中所述:

  • 身份转换(§5.1.1) = >method1(int a, int b)
  • 不断扩大的原始转换(第5.1.2节)
  • 扩展参考转换(第5.1.5节)
  • 装箱转换(第5.1.7节)(可选),然后加宽参考转换 == >method1(Integer... a)
  • 取消装箱转换(第5.1.8节),然后可以选择加宽原始转换。

在您的情况下,第一点适用并被method1(int, int)调用。

(更精确地说,你的方法使用varags并具有较低的优先级比简单的装箱转换。换句话说,如果有一个method1(Integer a, Integer b)会来之前method1(Integer... a)的层次)

为什么会这样呢?15.12.2中的注释提示:

这样可以保证,由于引入了可变arity方法,隐式装箱和/或拆箱,在Java SE 5.0之前在Java编程语言中有效的任何调用都不会被认为是模棱两可的。



 类似资料:
  • 问题内容: 从Java 1.5中,你几乎可以互换使用在许多情况下。 但是,我发现代码中存在潜在的缺陷,这让我有些惊讶。 如下代码: 值相等时,似乎无法正确设置不匹配,尽管我无法确定在什么情况下。我在Eclipse中设置了一个断点,发现值都为137,并且检查了布尔表达式,并说它是假的,但是当我越过它时,它会将不匹配设置为true。 将条件更改为: 解决了问题。 谁能阐明为什么会这样?到目前为止,我只

  • 使用以下代码,我得到以下编译错误。我还尝试使用输入作为整数列表,而不是int[],这样做效果很好。如果我使用box(),它也可以正常工作。 我的问题真的是如果Int Stream必须是整数流,以及如何处理错误消息“lambda表达式int[]中的错误返回类型无法转换为int” 错误:(13,49)java:不兼容的类型: lambda表达式int[]中的错误返回类型无法转换为int错误:(13,6

  • 问题内容: 如果我想对整数进行位操作,如何将其加载到?中?如何将其转换回int或long?我不太担心它的大小,它总是32或64位长。我只是想使用,,,和方法,而不是位运算符,但我无法找到一个简单的方法来初始化位集以数字类型。 问题答案: 以下代码从一个长值创建一个位集,反之亦然: 编辑:现在两个方向,@leftbrain:原因,你是对的

  • 在这个代码中,-20应该是最小值,因为它是负数,并且离零最远,正确吗?但当我运行MinAlgoritm时,会打印出整数5。我有一个最大版本的这个可以很好地工作,但这个不行。这怎么可能?我能做些什么改进吗?

  • 本文向大家介绍可被C整除的最大正整数,在C ++中范围为[A,B],包括了可被C整除的最大正整数,在C ++中范围为[A,B]的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到一个有趣的问题。让我们考虑我们有三个整数A,B和C。我们必须找到一个最小整数X,使得X mod C = 0,并且X不在[A,B]范围内。如果A,B和C的值分别为5、10和4,那么X的值为4。我们必须按照以下步骤获得

  • 本文向大家介绍取一个整数a从右端开始的4~7位。相关面试题,主要包含被问及取一个整数a从右端开始的4~7位。时的应答技巧和注意事项,需要的朋友参考一下 【参考答案】