byte b = 100 ;
编译没有任何错误,但是
int i = 100 ;
byte b = i ;
引发错误。为什么?即使直接将 100 分配给 b,我们也在分配一个 int 字面量。那么为什么我会收到错误消息?
byte b = 100 ;
编译没有任何错误,但是
int i = 100 ;
byte b = i ;
引发错误。为什么?即使直接将 100 分配给 b,我们也在分配一个 int 字面量。那么为什么我会收到错误消息?
byte b = 100 ;
这100
是一个编译时间常数。因此可以分配给byte
.
int i = 100 ;
// i = i + 100; // It's allowed to add this statement later on,
// if `i` is not declared final. And hence, the next assignment
// will clearly fail at runtime. So, compiler saves you from it
byte b = i ;
现在在这种情况下,因为i
没有声明final
,所以它不再是一个compile time
常数。在这种情况下,您可以稍后在 和之间修改,的值i
,如上例所示。这肯定会失败。这就是为什么编译器不允许分配to类型。initialization of i
assignment of i to byte
i
byte
但是,您可以使用显式转换来编译它,这当然可以crash
在运行时进行。通过进行显式转换,您可以告诉编译器 - “我知道我在做什么,只需为我做这件事”。因此,它不会担心该转换的运行时行为,并且会相信您没有做错任何事情。
因此,您可以声明您的int i
as final
,或者您需要进行强制转换:-
int i = 100 ; // replace 100 with 130, and you will be surprised that it works
byte b = (byte)i ;
因此,当您使用一个值130
并将其强制转换为 时byte
,您会通过compiler
,但肯定会在运行时崩溃。这就是他们compiler
试图避免的问题。
现在让我们回到第一个案例:-
byte b = 128;
上述分配现在将无法编译。因为即使该值128
是编译时间常数,它也不足以容纳 a byte
,并且compiler
知道。
byte b=100
会编译,因为字节的范围是从-128 到 127。
int i = 100 ; byte b = 129 ;// would give a compiler error
i
不是最终的,同时可能已经改变。
以下将起作用:
final int i = 100;
byte b = i;