2012-12-03 33 views
15

Cho đến bây giờ, sự hiểu biết của tôi là == là quá tải của nhà điều hành cho .equals(). Tuy nhiên, tôi vừa mới khám phá ra rằngNhà điều hành Groovy ==

new Integer(1) == new Long(1) // returns true 

trong khi

new Integer(1).equals(new Long(1)) // returns false 

vì vậy tôi đoán == là không chính xác một cách viết tắt cho .equals(), vì vậy làm thế nào nó xác định sự bình đẳng?

+0

Điều này tiếp tục cắn tôi khi sử dụng GORM, có ID cơ sở dữ liệu dài. Các yêu cầu từ JSON tạo ra các giá trị số nguyên cho hành vi như: groovy: 000> m = [1L: 'foo'] ===> [1: foo] groovy: 000> m.containsKey (1L) ===> true groovy: 000> m.containsKey (1) ===> sai –

Trả lời

17

== trong Groovy là tương đương với equals(), tuy nhiên, bạn sẽ tìm thấy nó khác với Java khi so sánh các lớp học khác nhau với cùng một giá trị - nếu lớp là Comparable. Groovy cũng thực hiện việc nhập kiểu nếu có thể.

Nếu bạn kiểm tra mã, có vẻ như cuối cùng là compareToWithEqualityCheck() được thực hiện cho ==.

4

Hóa ra == không ủy quyền cho equals(), nó ủy quyền cho compareTo. Vì vậy, == sẽ trả về true nếu a.compareTo(b) trả về 0

Vì vậy, trong trường hợp này đặc biệt

new Integer(1).compareTo(new Long(1)) == 0 

vì thế:

new Integer(1) == new Long(1) 

nhưng điều này không nhất thiết có nghĩa rằng

new Integer(1).equals(new Long(1)) 

Các lý do tại sao điều này rất kỳ lạ và khó hiểu là bởi vì contract of Comparable không yêu cầu rằng nó là phù hợp với bằng, mặc dù nó được khuyến khích mạnh mẽ.

Chúng tôi thực sự khuyên (mặc dù không bắt buộc) rằng thứ tự tự nhiên nhất quán với bằng. Điều này là như vậy bởi vì các bộ sắp xếp (và các bản đồ đã sắp xếp) mà không có bộ so sánh rõ ràng hoạt động "kỳ lạ" khi chúng được sử dụng với các phần tử (hoặc các khóa) có thứ tự tự nhiên không phù hợp với bằng.