[Dagger / MissingBinding] .Kotlinjvm.functions.Function1 <?无法提供超级java.lang.Integer.Unit>

时间:2019-10-27 10:42:50

标签: android kotlin dagger-2

无法提供类型为kolin lambda的{​​{1}}。但是可以提供(Int) -> Unit:-例如:-

() -> Unit

错误:-

@Module
class LambdaModule {
   @Provides
   fun getIntArgLambda(): (Int) -> Unit = {}

   @Provides
   fun getNoArgLambda(): () -> Unit = {}

   @Provides
   fun getRecyclerViewAdater(intLambda: (Int) -> Unit, noArg: () -> Unit): CustomAdapter = CustomAdapter(intLambda, noArg)
}

但是,如果我不使用[Dagger/MissingBinding] kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> cannot be provided without an @Provides-annotated method. ,它就会起作用:-

getIntArgLambda()

上面的代码有效:-

  

为什么我不能为同一 @Provides fun getRecyclerViewAdater(noArg: () -> Unit): CustomAdapter = CustomAdapter({}, noArg) 中的任何方法提供(Int) -> Unit参数?

1 个答案:

答案 0 :(得分:1)

这是一个方差问题。它与Java通配符有关。

功能:

@Provides
fun getIntArgLambda(): (Int) -> Unit = {}

在Java中返回:

kotlin.jvm.functions.Function1<java.lang.Integer, kotlin.Unit>

函数的参数intLambda

@Provides
fun getRecyclerViewAdater(intLambda: (Int) -> Unit, noArg: () -> Unit): CustomAdapter = CustomAdapter(intLambda, noArg)

在Java中是:

kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>

要禁止使用通配符,可以使用@JvmSuppressWildcards

@Module
class LambdaModule {
   @Provides
   fun getIntArgLambda(): (Int) -> Unit = {}

   @Provides
   fun getNoArgLambda(): () -> Unit = {}

   @Provides
   fun getRecyclerViewAdater(intLambda: Function1<@JvmSuppressWildcards Int, Unit>, noArg: () -> Unit): CustomAdapter = CustomAdapter(intLambda, noArg)
}