考虑以下:
class TypeCast {
public static void main(String[] args) {
byte by = 4; // Compiler casts int literal to byte
int in = 4;
byte byt = in; // Compilation Error: compiler can not cast automatically. WHY?
}
}
Run Code Online (Sandbox Code Playgroud)
我知道编译器可以在文字赋值的情况下缩小范围.但是当赋值涉及变量而不是文字时,它不能做同样的事情.为什么?
编辑:我想大多数人都无法理解我想要问的问题.它不是要分配'超出范围'的值,而是分配'范围内'值byte并让编译器处理缩小范围.很明显,'byte'将无法处理超出范围的值,并且显式转换将需要(并且我不想知道).
给定值落在byte范围内,int文字赋值byte和int类型变量赋值之间的区别是什么byte?
小智 22
因为在您的代码中,您可以更改变量的值.这就是为什么不允许将int变量赋给一个字节的原因,但是如果你将int变量声明为final,它将允许尝试这样:
public class Test {
public static void main(String[] args) {
final int i = 10;
byte by = i;
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着10在字节范围内,所以一切都很好,但是如果你写的话
public class Test {
public static void main(String[] args) {
final int i = 10000;
byte by = i;
}
}
Run Code Online (Sandbox Code Playgroud)
它会给你一个错误,因为10000不在一个字节的范围内.
恕我直言,主要原因是那样的代码(实际上不编译)
int in = ... // what if in == 1234?;
byte byt = in; // then byt == -46. Can you expect this?
Run Code Online (Sandbox Code Playgroud)
是危险的,因为潜在的溢出(int 1234变为-46字节).然而,
byte byt = 4;
Run Code Online (Sandbox Code Playgroud)
因为非法(溢出)代码就像是安全的
byte byt = 1234; // doesn't compile
Run Code Online (Sandbox Code Playgroud)
将导致编译时错误.但是你可以坚持:
// I'm warned about the overflow, but do as I command...
byte byt = (byte) 1234; // -46
Run Code Online (Sandbox Code Playgroud)
要么
int in = ...
byte byt = (byte) in; // I know what I'm doing! Cast it, please
Run Code Online (Sandbox Code Playgroud)