Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带三元运算符的重载方法调用歧义_Java_Definition_Overloading - Fatal编程技术网

Java 带三元运算符的重载方法调用歧义

Java 带三元运算符的重载方法调用歧义,java,definition,overloading,Java,Definition,Overloading,我正在为数字创建一个简单的包装器类。简单地说,我希望它显示42对42.0的值;但是,它应将值1.6180338显示为该数字。很简单 密码 问题 问题是42.0的值总是显示在toString中,而不是正确的42值。。。方法 我的想法 虽然字符串.valueOf。。。方法有很多重载方法将正确的原语值显示为字符串,在使用哪个重载方法时存在歧义。它可以使用String.valueOfdouble或String.valueOflong。这是因为三元运算符语句和结果类型 我认为编译器能够识别long类型并调

我正在为数字创建一个简单的包装器类。简单地说,我希望它显示42对42.0的值;但是,它应将值1.6180338显示为该数字。很简单

密码 问题 问题是42.0的值总是显示在toString中,而不是正确的42值。。。方法

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

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

问题 我知道这在Java中现在是不可能的,但是像这样的东西目前在其他语言中可用吗?有什么定义可以解释这种方法吗?你能更详细地解释一下吗


我指的是像协方差或逆方差这样的定义。注意:我意识到定义不是这两种语言中的一种:

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

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

通过这种方式,您将对数字进行框选,并使用String.valueOfObject,这对两个分支都很有效。

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

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

通过这种方式,您可以将数字框起来,并使用String.valueOfObject,这对两个分支都很有效。

没有专门的术语。只是,至少在静态类型语言中,每个表达式都有一种输出类型。因此,三元运算符表达式有两种输入类型,但只有一种输出类型,而在泛型的情况下,该类型可以依赖于输入的类型,例如,它不能依赖于输入的值。非静态类型语言脚本语言通常不一定有此限制,但它们通常也没有基于类型的重载-因为它们通常没有声明的类型,只有实际的类型。@ErwinBolwidt它不能依赖于输入的值这是按值还是按类型?表达式longValue有一个长类型,其中数字有一个双精度类型,它只有一个输出类型,尽管它有两个输入类型。这两种输入类型使用JLS第15.25节中指定的规则进行组合,因为@TagirValeev在他的回答中很好地引用了这些规则。downvote?没有研究?不清楚?没用?这个没有特别的术语。只是,至少在静态类型语言中,每个表达式都有一种输出类型。因此,三元运算符表达式有两种输入类型,但只有一种输出类型,而在泛型的情况下,该类型可以依赖于输入的类型,例如,它不能依赖于输入的值。非静态类型语言脚本语言通常不一定有此限制,但它们通常也没有基于类型的重载-因为它们通常没有声明的类型,只有实际的类型。@ErwinBolwidt它不能依赖于输入的值这是按值还是按类型?表达式longValue有一个长类型,其中数字有一个双精度类型,它只有一个输出类型,尽管它有两个输入类型。这两种输入类型使用JLS第15.25节中指定的规则进行组合,因为@TagirValeev在他的回答中很好地引用了这些规则。downvote?没有研究?不清楚?没用?好吧,花了一些时间去理解,但最终还是明白了。感谢Showever,我将在三元运算符中移动String.valueOf;在真假两个方面,演员们似乎都有点不对劲,花了一些时间去理解,但最终还是得到了。感谢Showever,我将在三元运算符中移动String.valueOf;无论是真是假,演员们似乎都有点错误