我正在尝试在 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。
HUWWW
相关分类