2014-11-11 4 views
1

я следующий метод:Java 7 дженерики вывод типа не может

protected <T> Func1<ApiResponse<T>, Observable<T>> checkApiSuccess() { 
    return new Func1<ApiResponse<T>, Observable<T>>() { 
     @Override 
     public Observable<T> call(ApiResponse<T> response) { 
      if (response.isSuccess()) { 
       return Observable.from(response.getResult()); 
      } 

      return Observable.error(new ApiException(response.getError())); 
     } 
    }; 
} 

Почему эта работа:

Func1<ApiResponse<LoginResult>, Observable<LoginResult>> 
     checkApiSuccessFunc = checkApiSuccess(); 

return apiService 
     .login(params) 
     .flatMap(checkApiSuccessFunc); 

, но это не делает:

return apiService 
     .login(params) 
     .flatMap(checkApiSuccess()); 

Я получаю ошибка времени компиляции no suitable method found for flatMap(Func1<ApiResponse<Object>>, Observable<Object>). Как-то при использовании метода непосредственно тип T больше не может быть сопоставлен с LoginResult.

+0

Подпись flatMap? – anstarovoyt

+0

Кстати, потоки являются частью Java 8. Как это Java 7? – RealSkeptic

+0

@Andrew: '' 'public final Observable flatMap (Func1 > func)' '' –

ответ

2

Тип вывода, вероятно, не может определить, что T должен быть LoginResult. Он может работать с Java 8, где система вывода типов была улучшена.

Вы можете попробовать использовать тип цели, чтобы помочь компилятору:

flatMap(this.<LoginResult> checkApiSuccess()) 
+0

это. anstarovoyt

+0

@Andrew действительно спасибо – assylias

+0

Я не знал, что вы можете указать тип, используя '' 'this. '' '. Узнал что-то новое сегодня, спасибо! –

0

В

Func1<ApiResponse<LoginResult>, Observable<LoginResult>> 
     checkApiSuccessFunc = checkApiSuccess(); 

return apiService 
     .login(params) 
     .flatMap(checkApiSuccessFunc); 

Компилятор выводит из заявленного типа checkApiSuccessFunc, что тип возвращаемого checkAPISuccess() есть, и от это все в нем.

Но в

return apiService 
     .login(params) 
     .flatMap(checkApiSuccess()); 

Существует очень мало информации, чтобы определить тип checkApiSuccess(). flatMap ожидает, что функция примет параметр <? super T>. Поэтому он ожидает что-то, что является суперклассом того, что испускает login, и поскольку у вас нет ничего, что ограничивает его, оно выводит Object. Вы не указали, что функция подписи, которую вызвал этот return для .