[Кинжал / MissingBinding] .Kotlinjvm.functions.Function1не может быть предоставлено - PullRequest
0 голосов
/ 27 октября 2019

Невозможно предоставить kolin lambda типа (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 param для любого метода в пределах того же module?

1 Ответ

1 голос
/ 27 октября 2019

Это проблема дисперсии. Это связано с подстановочными знаками 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)
}
...