2014-09-16 17 views
6

Làm thế nào tôi có thể có một phương thức với hai tham số, với cả hai tham số có cùng loại bê tông?Buộc hai tham số của một phương thức chung để có cùng loại bê tông

Ví dụ,

boolean equals(Object a, Object b) 

cho phép a của bất kỳ loại và b của bất kỳ loại.

Tôi muốn ép buộc ab có cùng loại bê tông. Tôi cố gắng

<T> boolean equals(T a, T b) 

và nhập một DateString phương pháp đó, mong đợi một lỗi thời gian biên dịch, nhưng tôi nhận được không có lỗi, vì T sẽ giải quyết để ? extends Serializable & Comparable, vì cả hai DateString cụ SerializableComparable.

+1

Tại sao bạn lại muốn làm điều đó? – AJMansfield

Trả lời

7

Bạn không thể, về cơ bản. Không có cách nào để làm điều đó. Thậm chí nếu bạn có thể làm điều đó cho một cuộc gọi đơn giản để ngăn cấm đối số của các loại khác nhau, nó có thể luôn luôn được bỏ qua bằng một dàn diễn viên:

equals((Object) date, (Object) string) 

Nếu bạn quan tâm trong thực hiện thời gian loại của các đối số, bạn chỉ có thể kiểm tra tại thời điểm thực hiện. Không có cách nào của trình biên dịch biết liệu đối số của loại Date có một giá trị tham chiếu đến chính xác một java.util.Date hoặc một số phân lớp phụ hay không.

+0

Cảm ơn bạn đã có câu trả lời cực nhanh. – yuku

1

Vấn đề là chữ ký của phương pháp của bạn trở nên

<? extends Object> boolean equals(? extends Object a, ? extends Object b) 

mà không cung cấp cho bạn bất kỳ tùy chọn. Thậm chí nếu bạn gọi

equals(new Date(), "hello world"); 

trình biên dịch thậm chí không cần phải phá vỡ một mồ hôi và xác định tổ tiên chung thấp nhất đối với các loại thông số của bạn.

Sửa

thực tế thú vị. Tôi biết những gì tôi đã viết ở trên là đúng, nhưng nó vẫn có vẻ hơi lạ. Vì vậy, tôi đã thử nghiệm

<T> boolean equals(T a, T b) { 
    return true; 
} 

<T,E> boolean equals(T a, E b) { 
    return true; 
} 

Trình biên dịch đã hét lên. Nguyên nhân là do trình biên dịch thực sự không tạo sự khác biệt và chỉ viết lại cả hai phương pháp như

boolean equals(? extends Object a, ? extends Object b) 

mà sau khi loại chô bôi trở thành

boolean equals(Object a, Object b) 

đó là chữ ký chính xác tương tự. Thật vậy, nếu tôi giữ phương thức equals(T,T) và tôi thêm một phương thức khác với chữ ký equals(Object, Object) trình biên dịch tiếp tục nói rằng tôi có cùng phương thức được khai báo ở nơi khác.

câu chuyện dài ngắn, phương pháp của bạn equals(T,T) cũng giống như equals(Object, Object) do loại tẩy xoá và do đó bạn không thể ép buộc kiểu tham số giống nhau, ít nhất là tại thời gian biên dịch, trừ bạn đặc biệt thực hiện equals phương thức cho mỗi .

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