为什么这段代码将 value 转换为 double 而不是 float?

问题描述

我有一个问题。为什么此代码打印 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;
    }
}

解决方法

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

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

考虑这个声明:

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

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

,

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

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

为此:

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

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