2012-02-20 27 views
9

Ai đó có thể giải thích loại byte java?Loại byte Java là lạ?

này không biên dịch:

byte b1 = 9; 
byte b2 = 1; 
byte b3 = b1 + b2; 

Trong khi điều này không:

byte b4 = 9 + 1; 
byte b5 = (char)(9+1); 

Bên cạnh đó, giao cho một chặng đường dài không hoạt động, ngay cả khi giá trị phù hợp với một byte:

byte b7 = (long)127; 

Nó thậm chí còn lạ hơn với trình bao bọc

này biên dịch:

Byte b6 = (int)3; 

Nhưng điều này không:

Integer i = (byte)3; 
+1

Nếu không có thông báo lỗi và số dòng của khiếu nại, điều này khá khó trả lời. – bmargulies

+0

Ngoài ra, 'byte x = 126 + 1;' hoạt động nhưng không phải 'byte y = 126 + 2;' Bằng cách nào đó, khi sử dụng giá trị có thể tính toán, trình biên dịch sẽ kiểm tra xem vùng chứa có đủ rộng không. Tuy nhiên, không thể tìm thấy ref trong JLS. – gawi

+0

Điều này được thảo luận theo chiều dài trong câu trả lời cho câu hỏi này: [link] (http://stackoverflow.com/questions/81392/java-why-do-i-receive-the-error-message-type-mismatch-cannot -convert-int-to-b) –

Trả lời

3

b6 không hoạt động do biên dịch thời gian thu thập các hằng số theo nghĩa đen. b7 không làm việc vì thời gian biên dịch thu hẹp được giới hạn cho tất cả nguyên thủy nhưng dài (loại kỳ lạ, không biết tại sao)

Phần thú vị là §5.2 of the JLS:

In addition, if the expression is a constant expression (§15.28) of type byte, short, char or int : 

A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable. 
A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is : 

- Byte and the value of the constant expression is representable in the 
    type byte. 

- Short and the value of the constant expression is representable in 
    the type short.  

- Character and the value of the constant expression is representable in the type char. 

If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs. 

Không có ý tưởng tại sao i không hoạt động mặc dù - mở rộng sẽ hoạt động tốt và trên thực tế, trình biên dịch sẽ tạo ra một cái gì đó giống như Integer.valueOf((byte)3); dù sao đi nữa. Sử dụng cuộc gọi rõ ràng hoạt động như mong đợi, tức là việc mở rộng đang diễn ra.

Khá thú vị khi sử dụng trình biên dịch Java nhật thực Integer i = (byte) 3; biên dịch tốt, dẫn tôi tin rằng bạn vừa tìm thấy lỗi trong javac - xin chúc mừng! (cũng là một trong hai hoặc một lỗi trong trình biên dịch eclipse, nhưng hành vi của nhật thực có vẻ đúng với tôi). FWIW Tôi đã báo cáo lỗi chống javac đến oracle ..

Tìm phần bên phải trong JLS ít hoạt động hơn định dạng mà nó có thể đọc được - vì vậy có thể dễ dàng hơn nếu bạn theo liên kết để thay thế.

+0

Tôi cũng nhầm lẫn tôi ... Tôi đoán nó sẽ được dịch sang một cái gì đó như = new Integer ((byte) 3)); Nhưng điều đó thực sự sẽ làm việc ... Tôi chỉ đoán nó không thực sự được làm rõ trong JLS – 0x434D53

+0

@CSE Không, trình biên dịch sử dụng phương thức 'valueOf' (vì bất kỳ ai sử dụng API của trình bao bọc, hàm khởi tạo thực sự không được công khai) , nhưng có nó có vẻ giống như một lỗi cho tôi bởi vì cuộc gọi rõ ràng thực sự hoạt động. [Đây] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7147289) báo cáo lỗi, vẫn chưa được xem xét bởi oracle dù là viết - có thể sẽ mất vài ngày. – Voo

-1

đoạn đầu tiên tạo ra lỗi biên dịch do cho tất cả các hằng số theo mặc định là int s trong java.

+2

Nhưng sau đó hai hàng đầu tiên sẽ thất bại? – 0x434D53

+0

Chăm sóc để giải thích một downvote, xin. – Roman

+0

@CSE: đó chính xác là những gì tôi đã mô tả trong câu trả lời này. – Roman

8

Đặc điểm ngôn ngữ Java 5.6.2 Khuyến khích số nhị phân: "Nếu không, cả hai toán hạng đều được chuyển đổi kiểu int".

Vì vậy, Java chuyển đổi cả hai toán hạng sang và int, do đó kết quả của phép cộng là int.

Bổ sung: Sự khác biệt giữa b3 và b4 là, trong b4 đó là Biểu thức không đổi (15.28), trong b3 nó là chữ.

+0

JVM Spec, có tất cả những gì bạn cần. http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#16021 – jn1kk

+0

Điều gì đang xảy ra với các lớp trình bao bọc? Dường như truy cập trực quan rằng một int có thể vừa với một Byte, nhưng một byte không thể phù hợp với một số nguyên –

+0

Vẫn đang cố gắng tìm ra Trình bao bọc. Nó khá khó để tìm ra những gì sẽ xảy ra từ các thông số kỹ thuật. – 0x434D53