我正在尝试在 Kotlin 中编写类似于以下 Java 代码的内容:interface Provider {}class ProviderImpl1 implements Provider {}class ProviderImpl2 implements Provider {}enum Providers { ONE(ProviderImpl1::new), TWO(ProviderImpl2::new); private final Supplier<Provider> supplier; Providers(Supplier<Provider> supplier) { this.supplier = supplier; } public Provider provider() { return supplier.get(); }}此代码编译并正常工作:Providers.ONE生成 的实例ProviderImpl1,并Providers.TWO给出 的实例ProviderImpl2。这是我在 Kotlin 中可以实现的目标:interface Provider {}class ProviderImpl1 : Provider {}class ProviderImpl2: Provider {}enum class Providers(private val factory: Supplier<Provider>) { ONE(Supplier{ ProviderImpl1() }), TWO(Supplier{ ProviderImpl2() }); fun provider(): Provider = factory.get()}它有效,但在 Java 中,我可以在枚举构造函数中使用构造函数引用。当我尝试在 Kotlin 中做同样的事情时,即ONE( ::ProviderImpl1 ),我收到以下编译错误:类型不匹配:推断的类型是 KFunction0 但供应商是预期的没有显式类型的 lambda 也不起作用:ONE( ::ProviderImpl1 )给类型不匹配:推断的类型是 () -> ProviderImpl1 但预期是供应商问题是:Kotlin 规范是否禁止这样做(如果是,为什么,因为 Java 似乎可以处理它),或者这只是当前 Kotlin 编译器的暂时缺陷?我build.gradle有以下plugins { id 'org.jetbrains.kotlin.jvm' version '1.2.61'}Kotlin 语言版本由 Idea(在项目设置中)显示为 1.2。
2 回答
HUWWW
TA贡献1874条经验 获得超12个赞
如果您将您的更改Supplier为 lambda,则可以在 Kotlin 中很好地实现这一点......
interface Provider
class ProviderImpl1 : Provider
class ProviderImpl2 : Provider
enum class Providers(private val supplier: () -> Provider) {
ONE({ ProviderImpl1() }),
TWO({ ProviderImpl2() });
fun provider(): Provider = supplier.invoke()
}
这里的变化是提交一个返回Provider实例的函数(本质上就是 a Suppiler)。这很好,因为如果将来您的Provider实现在构建时需要某种配置,这个 lambda 可以处理。
如果您的提供者是无状态的,您可以避免更改Providers.provider()为 a val,其中每个枚举类型只会创建一次。
添加回答
举报
0/150
提交
取消