【发布时间】: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 中是不可能的,但是目前其他语言中是否也有类似的功能?是否有某种定义可以解释这种方法,你能更详细地解释一下吗?
我的意思是像Covariance 或Contra-variance 这样的定义。注意:我意识到定义不是这两个之一:)
【问题讨论】:
-
对此没有专门的术语。只是——至少在静态类型语言中——每个表达式都有一个(输出)type。 (所以三元运算符表达式有两种输入类型,但只有一种输出类型)虽然类型可能取决于输入的 type(例如,在泛型的情况下),但它不能取决于输入的值。非静态类型语言(主要是脚本语言)不一定有这个限制,但是它们通常也没有基于类型的重载——因为它们通常没有声明类型,只有实际类型。跨度>
-
@ErwinBolwidt “它不能依赖于输入的值” 这是按值还是按类型?表达式
longValue()有一个long类型,而number有一个double类型 -
它只有一种输出类型,虽然它有两种输入类型。这两种输入类型使用 JLS 第 15.25 节中指定的规则组合在一起,@TagirValeev 在他的回答中很好地引用了。
-
投反对票?没有研究?不清楚?没用?
标签: java definition overloading