Фабрика Кодеина с интерфейсом. Предложение IDE дает неверный код - PullRequest
0 голосов
/ 12 июля 2020

У меня есть следующий код в модуле Kodein

    bind<Manager>() with factory { strategy: OrderStrategyType ->
        val manager: Manager = when (strategy) {
            OrderStrategyType.VOLATILITY -> VolatilityManager()
            else -> SimpleManager()
        }

        return@factory manager
    }

, где Manager - это интерфейс, а VolatilityManager() и SimpleManager() реализуют его.

IntelliJ предлагает встроенную переменную manager, если я применяю предложение, я получаю код:

    bind<Manager>() with factory { strategy: OrderStrategyType ->
        return@factory when (strategy) {
            OrderStrategyType.VOLATILITY -> VolatilityManager()
            else -> SimpleManager()
        }
    }

Однако, хотя IDE не обнаруживает проблем с этим кодом, он не компилируется с

Type inference failed: infix fun <C, A> with(binding: KodeinBinding<in C, in A, out Manager>): Unit
cannot be applied to
(Factory<Any?, OrderStrategyType, Any>)

Честно говоря, я не понимаю ошибку компилятора. Вывод кажется мне очевидным. Стоит ли переписывать свой код, если да, то как?

1 Ответ

0 голосов
/ 12 июля 2020
• 1000 return.

Силовое приведение, кажется, помогает

interface A
interface X
class B: A, X
class C: A, X

bind<A>() with factory { b: Boolean ->
    when(b) {
        true -> B()
        false -> C()
    } as A
}

PS: вам не нужно return@factory, как если бы это выражение.

...