重载方法使用三元运算符调用歧义

时间:2015-05-26 06:34:46

标签: java definition overloading

我正在为数字创建一个简单的包装类。简单地说,我希望它显示值42经文42.0;但是,它应该显示值1.6180338作为该数字。够了。

代码

private double number;

...

@Override
public String toString() {

    return String.valueOf(
            number == longValue()
                    ? longValue()
                    : number );

}

...

@Override 
public long longValue() { 

    return (long) number; 

}

问题

问题是42.0的值始终显示为 42方法中的正确toString(...)

我的想法

虽然String.valueOf(...)方法有很多重载方法可以将正确的原始值显示为字符串,但是使用重载方法存在歧义。它可以使用String.valueOf(double)String.valueOf(long)。这是因为三元运算符语句和结果类型。

我认为编译器能够识别long类型并调用适当的String.valueOf(long)方法。情况似乎并非如此;相反,JVM将在编译时选择最安全但最受限制的重载方法。在这种情况下,这是String.valueOf(double),因为它可以安全地将long转换为double

问题

我知道现在这在Java中是不可能的,但目前在其他语言中是否可以这样?是否有某种定义解释了这种方法,你能更详细地解释一下吗?

我指的是CovarianceContra-variance这样的定义。注意:我意识到定义不是这两个中的一个:)

1 个答案:

答案 0 :(得分:4)

由于Java是静态类型语言,因此三元运算符的结果必须具有在编译期间定义的显式类型,因此编译器可以继续处理外部表达式。由于三元的两个分支都是数字,因此它们被提升为更精确的类型,如JLS 15.255.6.2中所述。你可以解决这个问题,将对象的参数转换为对象:

return String.valueOf(
        number == longValue()
                ? (Object)longValue()
                : (Object)number );

这样你就可以输入数字并使用String.valueOf(Object),这对两个分支都很有效。