私は(java.util.function.Functionとしてはかなり同じ)エラーといくつかのパラメータ化サブインターフェイスについてユーザーに尋ねるための一般的な機能のインタフェースを持っている:ジェネリック型が機能的なインタフェースであることをjavaに伝えるには?
@FunctionalInterface
public interface Handler<Err,Resp> {
public Resp handle(Err param);
}
@FunctionalInterface
public interface RecoverableErrorHandler<Err> extends Handler<Err, RecoverableErrorResult > {}
@FunctionalInterface
public interface RetryIgnoreErrorHandler<Err> extends Handler<Err, RetryIgnoreAbortResult> {}
私は別のものにハンドラをラップすることにより、各ハンドラへのロギングを追加しますハンドラ:
private <Err,Resp,H1 extends Handler<Err,Resp> > H1 addLogToHandler(String s, H1 h) {
return (Err arg) -> {
Resp res = h.handle(arg);
logger.info(s+" returned "+res);
return res;
};
}
// some code omitted
RecoverableErrorHandler<String> netErrorHandler = ... // shows dialog and asks user what to do
netErrorHandler = addLogToHandler("Network Error handler", netErrorHandler);
これはreturn
とライン上error: incompatible types: H1 is not a functional interface
でコンパイルされません。
質問は、私は汎用的なH1
が機能的なインターフェイスであることをjavaに伝えることができますか?または、このコードをどうやって動作させるのですか?
に方法を変更することができます。戻り値の型はジェネリックパラメータ 'H1'です。実際の型を知らずに 'H1'のインスタンスを作成するにはどうすればいいですか? –
関数が引数と必要な戻り値型によって呼び出される場所でjava型を推論しませんか?私の例では、 '' netErrorHandler = addLogToHandler( "Network Error handler"、netErrorHandler);で '' H1のタイプは '' RecoverableErrorHandler ' –
でなければなりません。基本的に 'public T method(){return new Dog();}'を実行しようとしています。どのようにこれまでに動作する予定ですか?もしこのメソッドを呼び出してジェネリック型の引数として 'Cat'を使用したいのであれば? –