2016-02-04 19 views
37

Ai đó có thể vui lòng giải thích lý do tại sao các biên dịch sau:Tại sao gán ngắn để byte chỉ làm việc khi ngắn là cuối cùng?

final short s1 = 1; 
final char c1 = 1; 
byte b1 = s1; 
byte b2 = c1; 

Nhưng sau không (thông điệp biên dịch lỗi là Type mismatch: cannot convert from short to byte):

short s1 = 1; 
char c1 = 1; 
byte b1 = s1; 
byte b2 = c1; 
+0

Trình biên dịch của bạn nói gì? – Idos

+0

Loại không phù hợp: không thể chuyển đổi từ ngắn thành byte – MATH000

+0

@balalaika Tôi đoán anh ấy hiểu rằng anh ấy có thể truyền. Ông hỏi tại sao 4 dòng đầu tiên không gây ra vấn đề cho trình biên dịch. – GhostCat

Trả lời

47

Câu trả lời là trong JLS - 5.2. Assignment Conversion:

.. nếu biểu thức là một biểu thức hằng số (§15.28) kiểu byte, short, char, hoặc int:

  • Một thu hẹp nguyên thủy chuyển đổi có thể được sử dụng nếu loại biến là byte, short hoặc char và giá trị của biểu thức hằng số là biểu thị trong loại biến.

Khi bạn viết:

final short s1 = 1; 

Giá trị của biểu thức là biết tại thời gian biên dịch, và vì nó không thể thay đổi bạn không cần phải cast.

Trong đoạn mã thứ hai của bạn, giá trị không được biết tại thời gian biên dịch - được đánh giá trong thời gian thời gian chạy, vì vậy bạn sẽ cần một dàn diễn viên rõ ràng.


Nếu bạn cố gắng để biên dịch đoạn mã sau:

final byte b1 = 200; 
final byte b2 = 200; 
byte sum = b1 + b1; 

Bạn sẽ nhận được một biên soạn lỗi từ các giá trị ở phía bên phải là biết để trình biên dịch và nó biết rằng tổng không thể khớp với số byte.

17

Trong mẫu đầu tiên, trình biên dịch biết rằng s1c1 sẽ không bao giờ thay đổi và giá trị cuối cùng của chúng (1) phù hợp với byte.

Trong phần thứ hai, trình biên dịch lo lắng điều gì sẽ xảy ra nếu s1c1 là bên ngoài 0..255 -128..127 khi họ được gán cho một biến byte, và cảnh báo bạn rằng nó là không an toàn.

Nếu bạn định hình chúng một cách rõ ràng, Balalaika gợi ý rằng bạn dường như biết mình đang làm gì (hoặc ít nhất, nó có ai đó đổ lỗi nếu mọi thứ đi về phía nam), và cho phép bạn làm nó.

+0

Tuyệt vời!Bạn có thể chỉ ra giải thích về 'tính năng' này trong JLS không? –

+0

Bạn cũng có thể giải thích tại sao điều này: 'final long s1 = 1; int x = s1; 'không hoạt động? – MATH000

+5

Tôi không thể. Lời giải thích nhỏ nhặt là: JLS chỉ cho phép nó cho 'byte',' short', 'char' và' int' (tìm kiếm tuyệt vời, Maroun Maroun - +1!). Tuy nhiên, nhưng không cung cấp bất kỳ lời giải thích cho nó, hoặc cho sự thiếu sót của 'long'. Lời giải thích của tôi có ý nghĩa với tôi; nhưng tôi không thể hiểu tại sao 'long' không được phép cư xử theo cùng một cách. – Amadan

Các vấn đề liên quan