java为什么在方法返回类型中可以将char改为short
我在Java中有以下方法: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()
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;
}