java为什么在方法返回类型中可以将char改为short

java为什么在方法返回类型中可以将char改为short,java,methods,casting,char,short,Java,Methods,Casting,Char,Short,我在Java中有以下方法: private static short charToShort_1() { return 's'; } private static char shortToChar_1() { return ((short) 15); } private static short charToShort_2() { char ch = 's'; return ch; } private static char shortToChar_2()

我在Java中有以下方法:

private static short charToShort_1() {
    return 's';
}

private static char shortToChar_1() {
    return ((short) 15);
}

private static short charToShort_2() {
    char ch = 's';
    return ch;
}

private static char shortToChar_2() {
    short number = 15;
    return number;
}
为什么“charToShort_1”和“shortToChar_1”编译成功?

同时,最后两种方法“charToShort_2”和“shortToChar_2”无法编译(因为需要显式转换)。

3和4方法是错误的,因为这种转换正在缩小(数据丢失)。您必须明确表示您理解并同意与此转换相关的所有风险

5.1.3段
答案非常简单,因为在java中char是无符号数据类型,而short是有符号数据类型,因此在java中没有隐式转换

根据

char到short是一种缩小原语转换


真正的答案在于的§5.2中的这句话(适用于Java 8,但也适用于以前的版本)

此外,如果表达式是byte、short、char或int类型的常量表达式(§15.28):

如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换

因此,常量表达式被特别处理,因为它们允许一些其他表达式不允许的缩小转换。

此处:

private static short charToShort_1() {
    return 's';
}
's'
是一个常量表达式,该值可在
short
中表示。 因此编译器执行隐式转换

各国:

此外,如果表达式为常数表达式(§15.28),则 键入byte、short、char或int:

  • 如果 变量是byte、short或char,以及常量的值 表达式可以用变量的类型表示
short
值的范围是
-32768
32767
(包括在内)。
因此,超出这些界限的常量表达式
char
将产生编译错误:

private static short charToShort_2() {
   return '耀'; // 32768 numeric value       
}
关于此未编译的方法:

private static short charToShort_2() {
    char ch = 's';
    return ch;
}
charch='s'不是一个常量表达式。
可以使用新的
字符
值重新分配
ch
,该值在
short
中不可表示(例如
'耀'
32768
数值表示。
因此编译器希望您显式地将其转换为
short
可能是缩小原语转换。
将其更改为
final
变量,您将看到它编译得很好:

private static short charToShort_2() {
    final char ch = 's';
    return ch;
}
关于这个从
short
转换为
char
的方法,编译错误的原因与
charToShort_2()

最后,关于
shortToChar\u 1()

对short的转换可能会给人留下这样的印象:与使用
int
时相比,您花费的内存更少:

private static char shortToChar_1() {
    return 15;
}

事实上,它不会改变任何东西,因为在这两种情况下,编译器都会使用JVM指令将
字节作为整数值推送到堆栈上。

谢谢。
那么,为什么“charToShort_1”和“shortToChar_1”被成功编译了呢s'只是一个char,但方法return_type很短(对于charToShort_1)。's'不是charits,只是一个常量
private static char shortToChar_1() {
    return 15;
}