Không, bạn chỉ có thể tạo một lớp trừu tượng thay vì một giao diện như thế này:
public abstract class MyApi {
public final boolean equals(Object other) {
if (other == this) {
return true;
}
if (other instanceof MyApi) {
return equals((MyApi)other);
}
return false;
}
protected abstract boolean equals(MyApi other);
}
hoặc một phiên bản đơn giản hơn:
public abstract class MyApi {
public boolean equals(Object other) {
throw new UnsupportedOperationException("equals() not overridden: " + getClass());
}
}
EDIT (đã thử sau nhận xét từ @CodeConfident, cảm ơn! Không bao giờ giả định rằng nó sẽ hoạt động):
Bạn cũng có thể chỉ cần khai báo equals()
trong ab lớp stract (! không trong một giao diện) và do đó che giấu việc thực hiện Object
và thực thi một thực hiện mới trong bất kỳ lớp con:
public abstract class MyApi {
public abstract boolean equals(Object obj);
public abstract int hashCode();
}
Dù sao bạn nên luôn luôn thực hiện equals()
và hashCode()
với nhau để thực hiện hợp đồng.
Nguồn
2010-06-10 06:26:07
Lý do cơ bản của bạn cho điều này là gì? –
Trường hợp cụ thể mà tôi gặp phải khi câu hỏi này xuất hiện; Tôi có một giao diện mà một số lớp được triển khai. Các lớp này được xác định bởi một bộ nhận dạng duy nhất. Vì vậy, nếu hai số nhận dạng giống nhau, các đối tượng sẽ được xem là bằng nhau. Tại một thời điểm tôi đã có danh sách một trong các lớp đó và muốn biết liệu một đối tượng mới đã tồn tại trong danh sách chưa. Tôi nghĩ rằng nó sẽ là thanh lịch để sử dụng List.contains (..) cho kiểm tra này. Nhưng điều đó đòi hỏi rằng tôi có thể chắc chắn rằng bằng được ghi đè. Dễ dàng giải quyết theo các cách khác. Một lớp trừu tượng cũng sẽ hoạt động tốt. – Fredrik