Ваш HelloWorldCommand
ожидает Outputter
, но вместо этого вы предоставляете (String) -> Unit
. Существует несколько способов преодоления этого разрыва:
Вариант 1: введите функциональный тип
Вместо Outputter
ваш HelloWorldCommand
может запросить (String) -> Unit
напрямую.
class HelloWorldCommand @Inject constructor(private val outputter: (String) -> Unit)
Это будет работать, но вы можете указать другой тип (String) -> Unit
в другом месте вашего приложения. Если вы это сделаете, вам придется использовать что-то вроде @Qualifier
.
К счастью, это единственная введенная лямбда во всем уроке, насколько я могу судить, поэтому здесь проблем не будет .
Вариант 2: Сделать Outputter
typealias
Вы можете использовать typealias для Outputter
того же типа, что и (String) -> Unit
. Это работает идентично варианту 1, но более выразительно. К сожалению, он имеет ту же проблему, если вы когда-нибудь захотите добавить еще один (String) -> Unit
в свой график зависимостей позже.
typealias Outputter = (String) -> Unit
Вариант 3: Обеспечить реализацию интерфейса Outputter
Вместо того, чтобы предоставлять лямбду, вы можете предоставить объект, реализующий Outputter
. Это менее идиоматизированный c для простой функции, поскольку Kotlin не может назначать лямбда-выражения непосредственно интерфейсам SAM, определенным в Kotlin.
@Provides
fun textOutputter() = object : Outputter {
override fun output(output: String) = println(output)
}