2016-07-01 4 views
0

またはOptionalタイプの両方をパラメータとして受け入れるJavaで@FunctionalInterfaceを作成したいとします。私はこれをやろうとしましたが、共通のインターフェースを共有していないので、実現することは不可能です。私も@FunctionalInterfaceを呼び出す共通のラッパークラスを使用しようとしましたが、実行時に型パラメータが必要なので、これは不可能です。ストリームを受け入れる機能的なインタフェースかオプションか?

最小例:

@FunctionalInterface 
public interface AcceptingInterface<S, T> { 

    T accept(S s); 

} 

public class Test<S, T> { 

    private final AcceptingInterface<S, T> funcInterface; 

    private final Class<S> source; 

    private final Class<T> target; 

    public Test(AcceptingInterface<S, T> a, Class<S> s, Class<T> t) { 
     this.funcInterface = a; 
     this.source = s; 
     this.target = t; 
    } 

    public T invoke(S s) { 
     return s == null ? null : this.funcInterface.accept(s); 
    } 

    public Class<S> getSource() { 
     return source; 
    } 

    public Class<T> getTarget() { 
     return target; 
    } 
} 

たぶん私のアプローチは間違っている...私は、フィードバックおよび/または、この問題に対する解決策を受け取るのが大好きです。

+0

あなたが実装しようとしているものはよく分かりませんが、アダプタパターンを使用してこれらの2つを機能インターフェイスに合わせる必要があるようです。 –

+0

@LyubomyrShaydariv入力のおかげで、多分それは行く方法です、私はそれを試してみましょう。 –

答えて

4

私はあなたは以下のようなものを、ストリームへのオプションから変換するデフォルトのメソッドを追加することができ、その場合には0-1要素のストリームとしてオプションを扱いたいと仮定します。

@FunctionalInterface 
public interface AcceptingInterface<V, T> { 

    T accept(Stream<? extends V> s); 
    default T accept(Optional<? extends V> opt){ 
     return accept(opt.map(Stream::of).orElseGet(Stream::empty)); 
    } 

} 

のJava 9が想定されOptional.stream()メソッドを追加します。

+0

公正なアプローチのようです。上記の提案されたアダプターパターンでこれを動作させることができるかどうかを見てみましょう。 –

+0

@AlexvandenHoogen gustafcさんの答えは実際にストリームには_adapts_オプションです。これは前に私が話していたことです:あなたは_common_型に 'Stream'と' Optional'の両方を適応させるでしょう。この答えは 'Stream'と' Optional'を 'Stream'に適応させるだけです。これは完璧な例/答えです。 –

関連する問題