Например, у меня есть 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"));
Одно из решений использует явный общий характер 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 (Cat :: мяу))' –
Jesper
Просьба уточнить, в чем проблема является. Если это только факт, что он выглядит незнакомым, то я бы сказал: «Гораздо лучше привыкнуть к нему, чем использовать необработанные типы со всеми недостатками, которые приходят с ним ... – martinhh
@martinhh Вопрос касается вывода типа: почему, когда вы добавляете '.error (...)' после вызова '.success (...)', вывод типа больше не работает (теперь необходимо явно указать тип). – Jesper