2017-10-24 10 views
5

私は時系列データを表すクラスを書いていますつまり、基本的には、ジェネリック型Tジェネリックパラメータは

interface TimeSeries<T> { 
    void add(Instant when, T data); 
} 

私たちは実装を処理するクラスの一部をため(Instant, T)ペアのマップインタフェース

interface TimeStamped { 
    Instant getTimeStamp(); 
} 

と私は明示的に時間を明記せずに、このようなデータ項目を追加するためにTimeSeriesインターフェースでより便利な方法を提供したいです。基本的には、私は望んでいます

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です。静的型安全性を放棄することを回避する回避策はありますか?私が思い付くことができる唯一のものは

add(TimeStamped t, T data)

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); 
    } 
} 
あるタイプセーフが、それでも不便です。

+4

シンプルな回避策は 'interface TimeStampedTimeSeries TimeSeries 012 extends TimeStamped extends TimeSeries 'でしょう。タイムズリーにデータを入力するときに使用でき、それを消費するときに 'TimeSeries 'を参照することができます。 – assylias

+0

もう1つの回避策は静的メソッドstatic void add(TimeSeries timeSeries、X x) –

+0

@cppbeginnerを使用することです。 – Vlasec

答えて

1

私はあなたの質問を理解していると思います。基本的ににはTimeStampedが実装されていない単純なタイプがありますが、サブクラスの中にはいくつかのものがあります。そのような場合、@assyliasの回避策でさえ役立たない。

Java 8ではこの問題の解決策はまったくないと思いますが、Java 9の経験はありませんが、新機能について読んでいるうちに気付かなかったのです。つまり、静的なタイプの安全性や快適性を犠牲にすることになります。

どのような回避策が最適か分かりません。基本的に私たちは、これまでここに持っていることは次のとおりです。@assyliasの助言として、あなたのベースオブジェクトが既に、TimeStampedインターフェイスを実装例について

  • タイムスタンプ付きの専用インターフェイス。
  • @cppbeginnerが推奨する静的メソッド。私は構文が好きではありませんが、それは構文砂糖の意味ですが、あなたは静的呼び出しで終わります。それはかなり多用途ですが、あなたが望むことをします。
  • 構文砂糖のアイデアをあきらめて、スレーブのように入力してください。
  • タイプセーフティを放棄し、逆効果をもたらす良いコードを付けてください。
  • お待ちください、もう一つ可能性があります。代わりにTimeStampedインターフェイスのメソッドを使用し、TimeSeriesを引数として使用します。実際に静的に行くよりも良いが、ちょっとボトムアップ。

私はあなたのユースケースを知らないので、どちらがあなたに適しているか判断できません。それらのどれも完璧ではありません。私はすでにこの問題に直面しており、スーパースマートな解決策も見つけられませんでした。私ができなかったもう一つのことは、一般的なenumです。なぜなら、それが可能であれば面白いだろうということです(でもどちらでもない)。

関連する問題