Tôi viết một lớp học để trình bày dữ liệu chuỗi thời gian, tức là về cơ bản bản đồ về (Instant, T)
cặp cho một kiểu generic T
tham số Generic với hạn chế bổ sung thông qua các loại giao
interface TimeSeries<T> {
void add(Instant when, T data);
}
Một số các lớp chúng ta đối phó với thực hiện một giao diện
interface TimeStamped {
Instant getTimeStamp();
}
và tôi muốn cung cấp phương thức tiện lợi hơn trong giao diện TimeSeries
để thêm các mục dữ liệu như vậy mà không nêu rõ thời gian khám phá. Về cơ bản, tôi muốn
interface TimeSeries<T> {
void add(Instant when, T data);
default <X extends T & TimeStamped> void add(X data) {
add(data.getTimeStamp(), data);
}
}
but this seems not allowed by the language because I cannot use type variables in intersection types. Có một công việc xung quanh không liên quan đến việc loại bỏ an toàn kiểu tĩnh? Điều duy nhất tôi có thể đưa ra là
interface TimeSeries<T> {
void add(Instant when, T data);
default void add(TimeStamped data) {
add(data.getTimeStamp(), (T)data);
}
default void add(TimeStamped t, T data) {
add(t.getTimeStamp(), data);
}
}
add(TimeStamped t, T data)
là loại an toàn nhưng vẫn bất tiện.
Giải pháp đơn giản sẽ là 'giao diện TimeStampedTimeSeries mở rộng TimeSeries ' - bạn có thể sử dụng nó khi điền thời gian và khi tiêu thụ, bạn chỉ có thể tham chiếu đến 'TimeSeries >'. –
assylias
Cách giải quyết khác là sử dụng phương pháp tĩnh static void add (TimeSeries super X> timeSeries, X x) –
@cppbeginner mà một tuy nhiên không mang lại bất kỳ sự đơn giản thêm nào. – Vlasec