2017-08-02 14 views
0

DaggerはKotlinで提供された1つのメソッドを認識しません。これは、モジュールの重要な部分である:次のようにDagger 2はKotlinの提供方法を​​認識しません。 Javaは正常に動作します

@Provides 
    @AppScope 
    fun provideClient(cache: Cache, interceptors: List<Interceptor>?): OkHttpClient { 

     val httpBuilder = OkHttpClient.Builder() 

     interceptors?.let { 
      for (interceptor in interceptors) { 
       httpBuilder.addInterceptor(interceptor) 
      } 
     } 

     return httpBuilder 
       .cache(cache) 
       .build() 
    } 

    @Provides 
    @AppScope 
    fun provideInterceptors(): List<Interceptor>? { 
     return listOf(HttpLoggingInterceptor().setLevel(WebServiceConfig.LOGGING_LEVEL)) 
    } 

エラーメッセージは次のとおりです。

AppComponent.java:15: error: java.util.List<? extends okhttp3.Interceptor> cannot be provided without an @Provides-annotated method. 

私はMutableListを使用している場合は、それが動作します。したがって、質問は:Dagger2/KotlinのListの問題は何ですか?

+0

インターセプタプロバイダをクライアントプロバイダに配置して、再度ビルドを試みることはできますか? – savepopulation

+0

それは変わりません。しかし、私はそれを試した。同じ問題。 – grenzfrequence

+0

私はそれが違いを生むべきではないことを知っていますが、私は何とかこのような問題を修正しました。あなたがkotlinで短剣を使用しようとしているとき、あなたはいくつかの興味深い問題と解決策に直面しています。 – savepopulation

答えて

1

これは、一般的な相互運用性の問題です。

あなたはKotlinのパラメータとしてのインタフェース(のようなInterceptor)のListを使用する場合Listが共変であるので、あなたは、ビューのJavaの観点から、リストの型パラメータにワイルドカードを持つものとして、それを参照してください。

OkHttpClient provideClient(List<? extends Interceptor> interceptors) { ... } 

ただし、このワイルドカードは戻り値の型には追加されません。

List<Interceptor> provideInterceptors() { ... } 

これは、Javaファイルでモジュールのインスタンスを作成し、オートコンプリートによって提供されるメソッドを調べることで確認できます。

DaggerがList<? extends Interceptor>を探していて、他の方法がList<Interceptor>を返すのが問題です。

考えられる解決策:

  1. が追加され、ワイルドカードを防ぐために@JvmSuppressWildCards注釈を使用します(関連する質問hereを参照してください)。これは、モジュール全体からだけあなたが問題を抱えている単一の型パラメータ上にすべての方法、ちょうど約あらゆる範囲で使用することができます:

    interceptors: List<@JvmSuppressWildcards Interceptor>? 
    
  2. あなた」Listに明示的なout分散を追加します。方法はprovideInterceptorsに戻ります。興味深いことに、これはJavaからオートコンプリートを見ると表示されませんが、ビルドは修正されています。

    fun provideInterceptors(): List<out Interceptor>? { ... } 
    
  3. あなたが発見したとして、この問題を持っていないMutableListインタフェースを使用してください。 Listout位置にその型パラメータを持ち、そのため、それは共変です:あなたはListなくMutableListを使用する場合、これが唯一なぜ起こるかについては


。これにより、ワイルドカードはListに対して生成されますが、不変式のMutableListでは生成されません(これが問題ありません)。

また、このワイルドカードの生成は、typeパラメータが非最終型(オープンクラスまたはインタフェース)の場合にのみ発生します。だから、List<StringBuilder>(これは最終的です)というこの問題は発生しませんが、 List<BufferedReader>(これはありません)の値が得られます。

+0

Hey thanks many。 – grenzfrequence

関連する問題