Я пытаюсь написать в 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, но ожидается, что поставщик
Лямбда без явного типа также не работает:
ONE( ::ProviderImpl1 )
дает
Несоответствие типов: выводимый тип is () -> ProviderImpl1, но ожидался поставщик
Вопрос в том, запрещает ли это спецификация Kotlin (и если да, то почему, как кажется, Java справляется с этим), или это всего лишь временное несовершенство текущего компилятора Kotlin?
My build.gradle
имеет следующее
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.2.61'
}
Версия языка Kotlin отображается Idea (в настройках проекта) как 1.2.