Java 为什么字符重载不适用于三元表达式中的整数和字符?

Java 为什么字符重载不适用于三元表达式中的整数和字符?,java,Java,代码 输出 public static void main(String[] args) { System.out.println(returnValue('a')); System.out.println(returnValue(1)); System.out.println(returnValue(true ? 'a' : 1)); System.out.println(returnValue(false ? 'a' :

代码

输出

    public static void main(String[] args) {
        System.out.println(returnValue('a'));
        System.out.println(returnValue(1));
        System.out.println(returnValue(true ? 'a' : 1));
        System.out.println(returnValue(false ? 'a' : 1));
    }

    public static int returnValue(int i) {return i;}

    public static char returnValue(char c) {return c;}

重载函数工作得很好,但是当使用三元时,它似乎将int和char都转换为char版本。为什么会发生这种转换?

这由JLS在以下章节中定义:

条件表达式的类型确定如下:

[……]

如果其中一个操作数为T类型,其中T为字节、短字符或字符,而另一个操作数为int类型的常量表达式§15.28,其值可在T类型中表示,则条件表达式的类型为T


因此,在您的例子中,提到的T将是char,因为您有常数“a”,它是char,常数1是int,它适合于char类型的值范围。

这是由JLS在:

条件表达式的类型确定如下:

[……]

如果其中一个操作数为T类型,其中T为字节、短字符或字符,而另一个操作数为int类型的常量表达式§15.28,其值可在T类型中表示,则条件表达式的类型为T

在你的例子中,提到的T将是char,因为你有一个常数'a'是char,常数1是int,它符合char类型的值范围

a
1
a