2017-01-23 16 views
10

Có đoạn mã sau:Máy đóng gói và Auto-boxing

Integer time = 12; 
Double lateTime = 12.30; 
Boolean late = false; 
Double result = late ? lateTime : time; //Why here can I assign an Integer to a Double? 
System.out.println(result); 

It in:

12,0

Cái này không biên dịch. Tại sao?

Integer time = 12; 
Double lateTime = 12.30; 
Double result = time;  //Integer cannot be converted to Double 
System.out.println(result); 
+0

Kết quả kép = thời gian + 1.0; cũng sẽ biên dịch –

+0

Bản sao có thể có của [Java autoboxing and madern operator operator] (http://stackoverflow.com/questions/25417438/java-autoboxing-and-ternary-operator-madness) – Tom

Trả lời

12

Sự khác biệt là do hành vi của toán tử bậc ba trong Java.


Các ternary trường hợp có điều kiện:

Trong biểu late ? lateTime : time, Java sẽ tự động Unbox chính xác một trong những đối số (theo giá trị của late) để loại nguyên thủy tương ứng của nó. (Bạn có thể quan sát này bằng cách thiết lập time để nulllate để true: a NullPointerExceptionkhông ném cũng áp dụng khi thiết lastTime để nulllate-false..)

Nếu giá trị của biểu thức sẽ time , thì đây là số được mở rộng thành double.

Trong cả hai trường hợp, kết quả là double được tự động đóng hộp thành Double khi gán nó cho result.


Các trường hợp chuyển nhượng đơn giản:

Trong văn bản Double result = time;, Java không cho phép điều này vì nó hy vọng bạn sẽ rõ ràng hơn.


Cá nhân tôi tìm ra cơ chế của các nhà điều hành có điều kiện ternary Java đối với các loại nguyên thủy đóng hộp với là một trong những phần nguy hại nhất của ngôn ngữ.

+0

Ok, nhưng trong kết quả đầu tiên của exemple 'luôn luôn là một đôi hoặc được đúc thành một số nguyên? – Davide

+0

@Eran: Tôi đã rõ ràng hơn về cơ chế chính xác và đã thêm vào sting NPE. – Bathsheba

+1

Kết quả kép = thời gian + 1.0; cũng sẽ biên dịch. Trong thực tế như vậy sẽ + 0,0; Và +1 chỉ cho việc sử dụng của từ pernicious. –

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