【问题标题】:overloaded method call ambiguity with ternary operator三元运算符的重载方法调用歧义
【发布时间】:2015-05-26 06:34:46
【问题描述】:

我正在为数字创建一个简单的包装类。简单地说,我希望它显示值42 verses 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的值总是显示不是toString(...)方法中正确的42

我的想法

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

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

问题

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

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

【问题讨论】:

  • 对此没有专门的术语。只是——至少在静态类型语言中——每个表达式都有一个(输出)type。 (所以三元运算符表达式有两种输入类型,但只有一种输出类型)虽然类型可能取决于输入的 type(例如,在泛型的情况下),但它不能取决于输入的。非静态类型语言(主要是脚本语言)不一定有这个限制,但是它们通常也没有基于类型的重载——因为它们通常没有声明类型,只有实际类型。跨度>
  • @ErwinBolwidt “它不能依赖于输入的值” 这是按值还是按类型?表达式longValue() 有一个long 类型,而number 有一个double 类型
  • 它只有一种输出类型,虽然它有两种输入类型。这两种输入类型使用 JLS 第 15.25 节中指定的规则组合在一起,@TagirValeev 在他的回答中很好地引用了。
  • 投反对票?没有研究?不清楚?没用?

标签: java definition overloading


【解决方案1】:

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

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

这样你将把数字装箱并使用String.valueOf(Object),这对两个分支都很有效。

【讨论】:

  • 好的,花了一些时间理解,但终于明白了。谢谢
  • 但是,我将在三元运算符中移动String.valueOf;在真实和虚假的部分,因为演员表似乎有点错误
猜你喜欢
  • 2019-03-29
  • 2021-09-09
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2017-03-24
相关资源
最近更新 更多