Tôi có một giao diện để đảm bảo đối tượng có thể làm bản sao của bản thân:lớp con kế thừa giao diện chung
public interface Duplicable<T extends Duplicable<T>> {
public T duplicate();
}
tôi bây giờ có
class X implements Duplicable<X>
nhưng tôi cũng có một Y lớp mà kéo dài X.
Đây không phải là vấn đề, cho đến khi tôi cần một lớp chung khác:
public class DoStuffWithDuplicable<T extends Duplicable<T>>
tôi không thể sử dụng một phiên bản generic của DoStuffWithDuplicable sử dụng Y, vì nó không thực hiện Duplicable<Y>
nhưng Duplicable<X>
vì nó thừa hưởng nó từ X.
Vì vậy, tôi đã cố gắng
public class DoStuffWithDuplicable<T extends Duplicable<? super T>>
.. nhưng phương tiện này sau đó giới thiệu một dàn diễn viên không an toàn
(T) obj.duplicate()
trong phần mã. Các tham số lớp cũng phức tạp hơn và việc sử dụng lớp khó hiểu hơn. Bất kỳ ý tưởng làm thế nào để có được xung quanh vấn đề này?
Bạn có thể nói lại điều này: "Tôi không thể sử dụng một phiên bản generic của DoStuffWithDuplicable sử dụng Y, vì nó hiện không triển khai Duplicable nhưng Duplicable vì nó kế thừa từ X. " ? – tbsalling
xin lỗi, định dạng vấn đề – phil
Như một lưu ý, đây chính xác là lý do tại sao một số nhà khoa học máy tính nói rằng tất cả các lớp phải là 'abstract' hoặc' final'. Bạn cũng sẽ gặp phải các vấn đề với 'equals'; bạn có thể refactor để loại bỏ có một instantiable 'X'? – chrylis