带有接口的 Kodein 工厂。 IDE 建议产生不正确的代码

Kodein factory with interface. IDE suggestion produces incorect code

我在 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>)

老实说,我不明白编译器错误。推理对我来说看起来很明显。我应该重写我的代码吗?如果是的话,怎么做?

关于这段代码,Kotlin 1.3.72 没有问题。

interface A
class B: A
class C: A

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

如果你的 类 implements/extends 不止一个 interfaces/classes 类型推断现在可能不是你想要的类型 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 因为 when 是一个表达式。