gpt4 book ai didi

java - Java 8 中可变参数的构造函数歧义

转载 作者:太空狗 更新时间:2023-10-29 22:45:03 24 4
gpt4 key购买 nike

在下面的类中,由于对 this() 的调用不明确,我遇到了 Java 8 的编译错误。不过,在 Java 6 中,这个类编译得很好。我知道我可以使用工厂方法等重构它,但对于出现问题的实际类,我强烈希望暂时维护当前的 API。

谁能想出一种不改变外部 API 来解决歧义的方法?

public class Vararg8 {

public Vararg8(final Object... os) {}

public Vararg8(final boolean b,
final String s,
final int... is) {}

public Vararg8() {
this(true, "test", 4, 5, 6);
}
}

最佳答案

您可以通过显式传递 int[] 数组来实现:

public Vararg8()
{
this(true, "test", new int[]{4, 5, 6});
}

您可能会注意到,从某种意义上说,这仍然是模棱两可的:您传递的内容仍然与 Object... 构造函数兼容。这样做的原因是方法解析在不同的阶段进行,只有最后一个阶段允许考虑可变参数。因为您使用了一个显式数组,所以它可以很好地命中第二个数组而无需可变参数扩展。如果没有 varargs 扩展,它无法命中第一个,因此直到最后阶段才会考虑。

参见 the appropriate JLS docs :

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

The second phase (§15.12.2.3) performs overload resolution while allowing boxing and unboxing, but still precludes the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the third phase.

The third phase (§15.12.2.4) allows overloading to be combined with variable arity methods, boxing, and unboxing.

关于java - Java 8 中可变参数的构造函数歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39227561/

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