Отказ от ответственности: этот вопрос содержит код, использующий библиотеку rxjava
, но проблема не связана с ней. Я предоставляю всю информацию, необходимую для ответа тем, кто не знаком с этой библиотекой.
У меня есть следующий метод, который выбирает источник данных на основе кэширования некоторых данных или нет:
public Observable<? extends MetricDataSource> createForOwners() {
return Observable.defer(new Func0<Observable<? extends MetricDataSource>>() {
@Override
public Observable<? extends MetricDataSource> call() {
if (ownersCache.isCached()) {
return cacheMetricDataSource;
} else {
return androidApiMetricDataSource;
}
}
});
}
Не компилируется со следующей ошибкой:
Error:(29, 26) error: method defer in class Observable<T#2> cannot be applied to given types;
required: Func0<Observable<T#1>>
found: <anonymous Func0<Observable<? extends MetricDataSource>>>
reason: cannot infer type-variable(s) T#1
(argument mismatch; <anonymous Func0<Observable<? extends MetricDataSource>>> cannot be converted to Func0<Observable<T#1>>)
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>defer(Func0<Observable<T#1>>)
T#2 extends Object declared in class Observable
Подпись Observable.defer
:
public final static <T> Observable<T> defer(Func0<Observable<T>> observableFactory)
Func0
в основном содержит метод call()
, который возвращает объект универсального типа:
public interface Func0<T> { T call(); }
Источники данных объявляются как:
private final Observable<AndroidApiMetricDataSource> androidApiMetricDataSource;
private final Observable<CacheMetricDataSource> cacheMetricDataSource;
Итак, почему это не удается? defer
ожидает Observable<T>
, и я даю ему Observable<? extends MetricDataSource>
, что должно хорошо сочетаться с этим T
.
Изменить: если я заменю метод defer
закрытым в текущем классе, а затем заменю Observable<T>
на T
как в аргументе, так и в возвращаемом типе, он скомпилируется. Однако я должен использовать оригинальный метод Observable
.
Таким образом, это не удается:
private static <T> Observable<T> defer(Func0<Observable<T>> observableFactory) {
return null;
}
И этот он компилирует:
private static <T> T defer(Func0<T> observableFactory) {
return null;
}