在下面的类中,由于对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: