Các toán tử <
, >
, <=
và >=
chỉ được xác định cho các loại nguyên thủy. Vì vậy, sử dụng chúng trên các loại trình bao bọc khiến trình biên dịch unbox các đối tượng thành các nguyên thủy.
Điều này có nghĩa
System.out.println(a>=b);
tương đương với
System.out.println(a.intValue()>=b.intValue());
Tuy nhiên, ==
và !=
khai thác tồn tại cho cả hai loại nguyên thủy và các loại tài liệu tham khảo, vì vậy việc sử dụng chúng để so sánh hai đối tượng có kiểu wrapper nguyên thủy so sánh các tham chiếu thay vì các giá trị nguyên thủy mà chúng bao bọc.
Như Holger nhận xét, so sánh các tài liệu tham khảo đối tượng với ==
và !=
tồn tại bằng ngôn ngữ Java trước khi auto-boxing và tự động unboxing đã được giới thiệu, nhưng so sánh với <
, >
, <=
và >=
đã không được hỗ trợ cho bất kỳ loại tài liệu tham khảo trước tự động mở hộp được giới thiệu.
Điều này có nghĩa là trong những ngày đầu của Java, a>=b
đoạn mã của bạn sẽ không chuyển biên dịch (vì a
và b
không phải là loại số nguyên thủy). Mặt khác, đoạn mã a==b
của bạn vẫn sẽ chuyển biên dịch và trả lại false
.
Thay đổi hành vi của ==
và !=
đối với các loại tham chiếu xảy ra là trình bao bọc các số nguyên thủy sẽ thay đổi hành vi của mã hiện có, do đó phá vỡ khả năng tương thích ngược, đó có thể là lý do không được thực hiện.
Cảm ơn. Tôi cho rằng đây cũng là trường hợp với các toán tử '> =' và '<='? –
@GaurangSinghal yes – Eran
Cần lưu ý rằng khả năng sử dụng '==' và '! =' Để so sánh các tham chiếu tồn tại trong Java trước khi giới thiệu tự động unboxing, vì vậy không thể xác định chúng để so sánh các giá trị không được hộp, vì điều đó sẽ phá vỡ tính tương thích. Nếu không có di sản đó, việc xác định toán tử khác nhau để so sánh tham chiếu sẽ có thể và giải pháp sạch nhất. Thật không may, con tàu đó đã đi thuyền… – Holger