2016-10-10 14 views
5

Tìm thấy một số điều kỳ lạ trong java.Những điều kỳ lạ trong java

Code:

System.out.println(System.getProperty("java.version")); 
System.out.println((true) ? (int)2.5 : 3.5); 
System.out.println((true) ? (int)2.5 : 3); 
System.out.println((true) ? (int)2.5 + "" : 3.5); 

Kết quả:

 
1.8.0_40 
2.0 
2 
2 

nó là gì? Tại sao giá trị số nguyên trả về chỉ khi giá trị cho false không phải là một giá trị gấp đôi hoặc nếu chuỗi được thêm vào giá trị đúng? Tại sao làm tròn thứ hai làm việc bởi (int) cast, nhưng giá trị kép trả về chưa? Nó là một lỗi?

+0

Không, những thứ này không phải là lỗi. – Jesper

+4

Theo như trình biên dịch có liên quan, chỉ có một kiểu cho toàn bộ biểu thức '?:', Và nó chỉ ra rằng bằng cách tìm ra loại hẹp nhất trong chung giữa hai bên. –

+0

(Tôi thú nhận rằng tôi ngạc nhiên rằng dòng cuối cùng biên dịch, mặc dù.) –

Trả lời

3

Trong một sơ đồ:

(true) ? (int)2.5 : 3.5 

     int  double 
      \  /
      double 

Các double đen 2.5 được downsampled để int 2, sau đó thúc đẩy trở lại double 2.0 bởi vì đó là kiểu của biểu thức điều kiện.

4

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 chỉ định tất cả các quy tắc này, hoạt động chính xác nhất quán với đầu ra được quan sát của bạn.

Chỉ có một loại cho toàn bộ biểu thức ternary, và đó là những gì được trả về và đó là những gì System.out.println đang được gọi. Nếu bạn tra cứu nó trong bảng trong đặc tả đó, bạn sẽ thấy các loại trong các dòng bạn đã đề cập sẽ là double, intObject tương ứng.

2

Toán tử bậc ba có loại trả về không đổi.

Từ JLS, section 15.25:

Nếu không, chương trình khuyến mãi số nhị phân (§5.6.2) được áp dụng cho các loại toán hạng, và kiểu của biểu thức điều kiện là loại bạt của toán hạng thứ hai và thứ ba.

Điều này có nghĩa rằng trong (true) ? (int)2.5 : 3.5, 2.5 được chuyển đổi thành một int, (làm tròn xuống) sau đó mở rộng đến một double.

Trong (true) ? (int)2.5 : 3, int không cần phải được mở rộng thành double, bởi vì phía bên kia cũng là int.

Cuối cùng, trong (true) ? (int)2.5 + "" : 3.5);, nó không thể mở rộng vì nó đã được chuyển đổi thành String.

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