gpt4 book ai didi

Java:重载方法解析和可变参数——令人困惑的例子

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:37 26 4
gpt4 key购买 nike

就在我以为我明白了的时候JLS15.12因为它适用于可变参数,下面是这个例子:

package com.example.test.reflect;

public class MethodResolutionTest2 {
public int compute(Object obj1, Object obj2) {
return 42;
}
public int compute(String s, Object... objects)
{
return 43;
}

public static void main(String[] args) {
MethodResolutionTest2 mrt2 = new MethodResolutionTest2();
System.out.println(mrt2.compute("hi", mrt2));
System.out.println(mrt2.compute("hi", new Object[]{mrt2}));
System.out.println(mrt2.compute("hi", new Object[]{mrt2, mrt2, mrt2}));
}
}

打印出来

42
43
43

我理解第一行:JLS15.12说方法解析是分阶段发生的,阶段 1 和阶段 2 忽略可变参数方法以找出是否有兼容的方法,只有在阶段 1 和阶段 2 失败时才会发生阶段 3(包括可变参数)。 (参见 JLS 和 this SO question.)因此,如果 compute(Object obj1, Object obj2) 应用,compute(String s, Object... objects) 总是被忽略。

但是我不明白为什么另外两行打印的是43。 Object[] 也是 Object 的一个实例,那么为什么它匹配 varargs 方法呢?


编辑:

...还有这个

Object arg2 = new Object[]{mrt2};
System.out.println(mrt2.compute("hi", arg2));

打印42

最佳答案

8.4.1部分:

If the last formal parameter is a variable arity parameter of type T, it is considered to define a formal parameter of type T[].

由于您显式提供了一个数组,因此这允许后两次调用匹配第一阶段中的变量元数方法,而无需考虑变量元数。

关于Java:重载方法解析和可变参数——令人困惑的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6032901/

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