1
byte b = 100 ; 

编译没有任何错误,但是

int i = 100 ; 
byte b = i ; 

引发错误。为什么?即使直接将 100 分配给 b,我们也在分配一个 int 字面量。那么为什么我会收到错误消息?

4

3 回答 3

5
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 iassignment of i to byteibyte

但是,您可以使用显式转换来编译它,这当然可以crash在运行时进行。通过进行显式转换,您可以告诉编译器 - “我知道我在做什么,只需为我做这件事”。因此,它不会担心该转换的运行时行为,并且会相信您没有做错任何事情。

因此,您可以声明您的int ias 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知道。

于 2012-12-04T14:45:13.493 回答
1

byte b=100会编译,因为字节的范围是从-128 到 127

    int i = 100 ; byte b = 129 ;// would give a compiler error
于 2012-12-04T14:41:11.777 回答
1

i不是最终的,同时可能已经改变。

以下将起作用:

final int i = 100; 
byte b = i;
于 2012-12-04T14:43:26.187 回答