2011-07-09 9 views
10

Tôi sẽ xem qua một cuốn sách về cấu trúc dữ liệu. Hiện tại tôi đang ở trên biểu đồ và mã bên dưới dành cho phần đỉnh của biểu đồ.java tại sao phải bằng tham số đầu vào phương thức là Object

class Vertex<E>{ 
    //bunch of methods 

    public boolean equals(Object o){ 
     //some code 
    } 
} 

Khi tôi cố gắng thực hiện phương thức này bằng trình biên dịch của tôi phàn nàn về việc không kiểm tra loại tham số và chỉ cho phép bất kỳ đối tượng nào được gửi. Nó cũng có vẻ hơi lạ đối với tôi tại sao tham số đó không phải là Vertex thay vì Object. Có một lý do tại sao tác giả làm điều này hay đây là một số sai lầm hoặc ví dụ cổ?

+0

Ông có thể lặp lại * chính xác * nhắn biên dịch ở đây, xin vui lòng? –

+0

Tôi có thể thấy không có lý do gì mà bạn chấp nhận Object thay vì Vertex. – Jeremy

+0

Tôi sẽ gọi đó là cảnh báo, không phải lỗi. – adarshr

Trả lời

13
@Override 
public boolean equals(Object obj) 
{ 
    if(obj == null) return false; 
    else if (!(obj instanceof Vertex)) return false; 
    else return // blah blah 
} 
+1

Trước tiên, bạn có thể muốn kiểm tra xem obj đó có phải là rỗng không. –

+0

@Hovercraft Full Of Eels Đã sửa lỗi, cảm ơn –

+0

Đủ công bằng, 1+ –

3

equals là phương thức được thừa kế từ Object, được định nghĩa là đủ linh hoạt để bạn có thể lấy bất kỳ đối tượng nào và kiểm tra nếu nó bằng bất kỳ đối tượng nào khác (vì nó có thể làm đúng) có cách nào khác không?

Sửa 1

Cảm nhận từ jhlu87:
như vậy là nó không phải hình thức tốt để viết một phương thức equals có một tham số đầu vào của đỉnh?

Bạn có thể tạo quá tải cho bất kỳ phương pháp nào, bao gồm cả bằng, nhưng làm như vậy mà không thay đổi tên có thể gây nhầm lẫn nhiều người cho rằng bạn bằng là người kế thừa từ Object. Nếu đó là mã của tôi và tôi muốn có một phương thức equals cụ thể hơn, tôi sẽ đặt tên nó hơi khác với chỉ "bằng" chỉ để tránh nhầm lẫn.

+0

vì vậy nó không phải là hình thức tốt để viết một phương thức equals có một tham số đầu vào của đỉnh? – jhlu87

+0

@jhlu: xin vui lòng xem ** Chỉnh sửa 1 ** –

+2

Tại bất cứ ai xuống bình chọn câu trả lời của tôi: xin vui lòng ít nhất để lại một bình luận. –

10

bằng (Đối tượng) là phương thức được xác định trong thư mục gốc - Đối tượng. Nếu bạn không khớp chính xác với chữ ký, phiên bản của Object sẽ được gọi khi ai đó kiểm tra xem hai đối tượng có bằng nhau hay không. Không phải những gì bạn muốn.

Bạn có thể đã thấy các phương pháp khác (như Comparator), nơi bạn có thể sử dụng thời gian chính xác. Đó là bởi vì các API đó là chung chung ified với Java 5. Equals không thể vì nó là hợp lệ để gọi bằng với hai kiểu riêng biệt. Nó sẽ trả về false, nhưng nó là hợp lệ.

2

Đó là bởi vì phương pháp này tồn tại trước Generics, vì vậy cho compatabitity ngược nó phải ở lại theo cách này.

Cách giải quyết tiêu chuẩn để áp đặt loại là:

return obj instanceof MyClass && <some condition>; 
0

Đó là vì tác giả là trọng bằng. Equals được xác định trong java.lang.Object và là một cái gì đó mà tất cả các lớp đều sinh ra.

Xem javadoc cho java.lang.Object

+0

Xem tại đây cách thực hiện đúng equals (và hashCode) http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – Kristian