2017-10-24 24 views
5

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 Ttham 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.

+4

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

+0

Cách giải quyết khác là sử dụng phương pháp tĩnh static void add (TimeSeries timeSeries, X x) –

+0

@cppbeginner mà một tuy nhiên không mang lại bất kỳ sự đơn giản thêm nào. – Vlasec

Trả lời

1

Tôi đoán tôi hiểu câu hỏi của bạn. Về cơ bản, bạn có thể có một số TimeSeries với một số loại đơn giản không thực hiện TimeStamped, nhưng một số lớp con của nó thực hiện. Trong những trường hợp đó, thậm chí không có giải pháp thay thế bởi @assylias giúp. Vâng, tôi nghĩ rằng không có giải pháp sạch cho vấn đề này trong Java 8, và tôi không có kinh nghiệm với Java 9, nhưng tôi đã không nhận thấy bất cứ điều gì như thế trong khi đọc về các tính năng mới của nó. Điều đó có nghĩa là bạn hoặc hy sinh loại an toàn tĩnh hoặc thoải mái.

Thật khó để biết giải pháp tốt nhất là gì. Về cơ bản những gì chúng tôi có ở đây cho đến nay là:

  • timestamped chỉ giao diện cho các trường hợp đối tượng cơ sở của bạn đã cài đặt giao diện TimeStamped, như tư vấn bởi @assylias.
  • Phương pháp tĩnh theo lời khuyên của @cppbeginner. Tôi không thích cú pháp mặc dù, nó có nghĩa là đường cú pháp, nhưng bạn kết thúc với một cuộc gọi tĩnh. Nó khá linh hoạt và làm những gì bạn muốn.
  • Hoàn toàn từ bỏ ý tưởng đường cú pháp và chỉ cần nhập nó như một nô lệ.
  • Hãy từ bỏ loại an toàn và có mã đẹp để có thể phản tác dụng.
  • Ồ chờ đã, một khả năng nữa. Thay vào đó, hãy sử dụng phương thức của giao diện TimeStamped, với đối số TimeSeries. Trên thực tế tốt hơn so với đi tĩnh, nhưng kinda dưới lên.

Tôi không thể quyết định cái nào tốt hơn cho bạn vì tôi không biết trường hợp sử dụng của bạn. Không ai trong số họ là hoàn hảo. Tôi đã gặp phải vấn đề này và tôi không tìm thấy giải pháp siêu thông minh nào. Một điều khác mà tôi không thể làm là một enum chung. Tôi có nghĩa là, tại sao không, nó sẽ là thú vị nếu nó có thể (nhưng nó không phải, hoặc là).

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