我在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”(因为需要显式强制转换)。
发布于 2018-02-11 06:29:58
在此:
private static short charToShort_1() {
return 's';
}
's'
是一个常量表达式,这个值在short
中是可表示的。所以编译器会进行隐式转换。
JLS指出:
此外,如果表达式是字节、短、字符或int类型的常量表达式(§15.28):
short
值范围是-32,768
到32,767
(包括在内)。
因此,超出这些界限的常量表达式char
将产生编译错误:
private static short charToShort_2() {
return '耀'; // 32768 numeric value
}
关于这个不编译的方法:
private static short charToShort_2() {
char ch = 's';
return ch;
}
char ch = 's';
不是一个常量表达式。
您可以使用一个不能在中表示的新char
值(例如由32768
数值表示的'耀'
)重新分配ch
。
因此,编译器希望您显式地将其转换为short
,因为转换可能是缩小原语转换。
将其转换为final
变量,您将看到它编译得很好:
private static short charToShort_2() {
final char ch = 's';
return ch;
}
关于这个从short
转换到char
的方法,编译错误的原因与charToShort_2()
完全相同。
最后,关于shortToChar_1()
:
private static char shortToChar_1() {
return ((short) 15);
}
对短片的使用可能会给人一种印象,即与使用int
相比,您花费的内存更少:
private static char shortToChar_1() {
return 15;
}
实际上,它不会改变任何东西,因为在这两种情况下,编译器都将使用bipush
JVM指令将byte
作为整数值推送到堆栈上。
发布于 2018-02-11 06:17:23
3和4方法是错误的,因为这种转换正在缩小(随着数据的丢失)。您必须明确指出,您理解并同意与此转换相关的所有风险。
5.1.3段https://docs.oracle.com/javase/specs/jls/se6/html/conversions.html
发布于 2018-02-11 06:22:08
https://stackoverflow.com/questions/48732427
复制