带有接口的 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 是一个表达式。
我在 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 是一个表达式。