【问题标题】:Why this code convert value to double instead to float?为什么这段代码将值转换为双精度而不是浮点数?
【发布时间】:2021-02-17 16:23:51
【问题描述】:

我有一个问题。为什么此代码打印 YYZ10.0 而不是打印 XXZ10.0? 第一个构造函数是 A(int),然后在语句内部返回 false,因此 9+1f 应该跳转到 A(float) 构造函数,但它会跳转到 A(double)。

public class Main {
    public static void main(String[] args) {
        System.out.print(new A(011).fun()[1]);
    }
}

class A{
    double value;
    public A(int value){
        this(value >> 2 == 1 ? value+1.0 : value+1f);
    }
    public A(float value){
        System.out.print("XX");
        this.value = value;
    }
    public A(double value){
        System.out.print("YY");
        this.value = value;
    }
    public Object[] fun(){
        return new Object[]{new Object(), this};
    }
    public String toString(){
        return "Z"+value;
    }
}

【问题讨论】:

  • double value 是双精度数,不会因为您使用 +1f 向其添加浮点数而自动更改为浮点数。
  • 但是当我将 double 值更改为 float 值时出现错误:从 double 到 float 的 ossible 有损转换,所以我认为它仍然是 double 构造函数。
  • 三元表达式的两个可能结果必须具有相同的类型。您正在尝试做的事情在某些情况下结果将是浮点数,而在其他情况下它将是双精度是不可能的。三元运算符的结果要么总是浮点数,要么总是双精度数。

标签: java object constructor


【解决方案1】:

如果一个方法有多个重载,Java 会在编译时而不是在运行时选择调用哪一个。在这种情况下,您通过this 调用构造函数。在编译时,Java 决定调用三个构造函数中的哪一个,您可以看到它必须是接受 double 的那个。

Java 必须选择接受double 的构造函数,不仅因为它可以处理doublefloat 两种情况,还因为没有float 情况。三元表达式只能有一种类型。有时不是double,有时不是float;总是double

考虑一下这个说法:

____ result = value >> 2 == 1 ? value+1.0 : value+1f;

你会在空白处填写什么类型?没有办法写“有时double,有时float”。必须是double

【讨论】:

    【解决方案2】:

    更改这一行(在A(int) 构造函数中):

    this(value >> 2 == 1 ? value+1.0 : value+1f);
    

    到这里:

    this(value >> 2 == 1 ? value+1f : value+1f);
    

    它应该以这种方式调用正确的构造函数。

    【讨论】:

    • 好的,但是为什么当 011>>2 (9 >> 2 = 2) 并且语句为假时它仍然尝试使用 A(double) 构造函数。
    • 这就像你试图让一个方法在不同的情况下返回一个float 和一个double。三元运算符自动将float 转换为double,因为它在一种情况下不能返回float,在另一种情况下不能返回double
    猜你喜欢
    • 2010-09-07
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多