2013-08-29 135 views
15

Tôi là một giải pháp kiến ​​trúc sư cấp cao, nhưng gần đây tôi vấp vào một câu hỏi mà khiến tôi dừng lại và suy nghĩ ...So sánh đối tượng và int trong Java 7

Đối với tôi, mã dưới đây luôn nên kích hoạt một lỗi, nhưng khi một trong những đồng nghiệp của tôi hỏi tôi tại sao Eclipse không hiển thị, tôi không thể trả lời bất cứ điều gì.

class A { 
    public static void main(String... args) { 
     System.out.println(new Object() == 0); 
    } 
} 

Tôi đã điều tra và thấy rằng với mức nguồn 1.6 nó thực sự ném một lỗi:

incomparable types: Object and int 

Nhưng bây giờ trong 1,7 nó biên dịch ok.

Xin vui lòng, tính năng mới nào đảm bảo hành vi này?

Trả lời

9

Ý của bạn là gì bởi "tính năng mới nào đảm bảo hành vi này?" ? 1.7 đang khắc phục vấn đề trong 1.6. new Object() == 0 phải có không bao giờ gây lỗi và luôn là gây ra autoboxing để kích hoạt.

Có chỉ đơn giản là không có lý do tại sao

Object a= 5 ; 

là đúng, và không phải là biểu hiện

a == 3 

hoặc thậm chí

a == 5 

Đó là vô cùng kỳ lạ và, IMHO, mâu thuẫn với bản thân đặc tả ngôn ngữ.

Từ quan điểm năng động của quan điểm, tuy nhiên, a == 5 vẫn đánh giá để false khi (Integer)a == 5 hoặc thậm chí (int)a == 5 đánh giá để true. Lý do là autounboxing được thiết kế để không bao giờ sản xuất ClassCastException s và do đó chỉ xảy ra cho các loại trình bao bọc, tĩnh. Hai trường hợp sau là các phôi rõ ràng, vì vậy, thường cho phép ClassCastException s.

+0

Giờ bạn có nghĩa là nó tương đương với 'đối tượng mới() == null' và' đối tượng mới() == 2' vẫn kích hoạt lỗi không? –

+0

Nó phải ít nhiều tương đương với 'new Object() == new Integer (0)' (hoặc 'new Integer (2)'). Nó không bao giờ là một lỗi, và luôn luôn là 'false' vì' Object' mới không thể là đối tượng giống với đối tượng 'Integer'. – ajb

+5

@MartijnCourteaux Không hẳn. Nó tương đương với 'new Object() == Integer.valueOf (0)' và 'new Object() == Integer.valueOf (2)'. Cả hai sẽ luôn luôn sản xuất sai, tất nhiên. –