在下面的类中,由于对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参数。因为您使用了显式数组,所以不需要varargs扩展就可以达到第二个精度。没有varargs扩展,它就无法达到第一个,因此直到最后阶段才被考虑。
参见the appropriate JLS docs:

09-16 03:52