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 .
Tại sao bạn lại muốn làm điều đó? – AJMansfield