は、私がSimpleCallbackクラスにジェネリック医薬品、例えば型消去および静的ファブリック方法
public class SimpleCallback<T> implements Callback<T> {
private SuccessListener<T> successListener;
private ErrorListener errorListener;
protected SimpleCallback() {
}
public static <C> SimpleCallback<C> success(SuccessListener<C> listener) {
SimpleCallback<C> callback = new SimpleCallback<>();
callback.successListener = listener;
return callback;
}
public SimpleCallback<T> error(ErrorListener errorListener) {
this.errorListener = errorListener;
return this;
}
@Override
public void onComplete(T result) {
notifySuccess(result);
}
@Override
public void onError() {
notifyError();
}
public interface SuccessListener<T> {
void onSuccess(T result);
}
public interface ErrorListener {
void onError();
}
}
を持っている今、私は猫が非同期取得のためにこのコールバックを使用したい:
SimpleCallback<List<Cat>> callback = SimpleCallback
.success(cats -> cats.forEach(Cat::meow));
今は大丈夫ですが、とき私は私の猫は
SimpleCallback<List<Cat>> callback = SimpleCallback
.success(cats -> cats.forEach(Cat::meow)) <-- Here cats become objects
.error(() -> System.out.println("Cats error"));
一つの解決策の使用明示的なジェネリックTYの生の対象となるエラーリスナーを追加したいですpe:
SimpleCallback<List<Cat>> callback = SimpleCallback.<List<Cat>>
.success(cats -> cats.forEach(Cat::meow))
.error(() -> System.out.println("Cats error"));
しかし、少し醜いです。明示的なジェネリック型なしでコールバックを作成する方法はありますか?
UPD:私は@Jesperが
別の解決策が明示的にラムダ式の引数の型を提供することで優れたソリューションを提供すると思う:ジェネリック型変数を消去する
.success((List<Cat> cats) -> cats.forEach(Cat::meow))
別の解決策が明示的にラムダ式の引数の型を提供することです: '.success((一覧猫) - > cats.forEach(猫::ニャー))' –
Jesper
何の問題を明確にしてくださいです。それが馴染みにくいだけの事実なら、私は言うでしょう:それに付随するすべての欠点を持つ生の型を使うよりも、それに慣れるほうがはるかに良いです... – martinhh
@martinhh質問は型推論です:なぜ、 '.success(...)'の呼び出しの後に '.error(...)'を追加すると、型推論はもはや機能しません(今度は型を明示的に指定する必要があります)。 – Jesper