构造函数模糊与java 8中的varargs

Ozy*_*ias 16 java

在下面的类中,由于调用模糊,我得到了Java 8的编译错误this().但是,使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

chi*_*ity 18

你可以通过传递一个显式int[]数组来做到这一点:

public Vararg8()
{
  this(true, "test", new int[]{4, 5, 6});
}
Run Code Online (Sandbox Code Playgroud)

您可能会注意到,从某种意义上说,这仍然是模棱两可的:您传递的内容仍然与Object...构造函数兼容.这样做的原因是方法分辨率处于不同阶段,只有最后阶段允许考虑varargs参数.因为你已经使用了一个显式数组,所以它可以很好地击中第二个数组而不需要扩展varargs.没有varargs扩展就无法击中第一个,所以直到最后阶段都不会考虑.

请参阅相应的JLS文档:

第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.

第二阶段(§15.12.2.3)执行重载解析,同时允许装箱和拆箱,但仍然排除使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第三阶段.

第三阶段(§15.12.2.4)允许重载与变量arity方法,装箱和拆箱相结合.