Kotlin:参数化类型的构造函数引用给出了编译错误

我正在尝试在 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。


ITMISS
浏览 187回答 2
2回答

HUWWW

如果您将您的更改Supplier为 lambda,则可以在 Kotlin 中很好地实现这一点......interface Providerclass ProviderImpl1 : Providerclass ProviderImpl2 : Providerenum class Providers(private val supplier: () -> Provider) {&nbsp; &nbsp; ONE({ ProviderImpl1() }),&nbsp; &nbsp; TWO({ ProviderImpl2() });&nbsp; &nbsp; fun provider(): Provider = supplier.invoke()}这里的变化是提交一个返回Provider实例的函数(本质上就是 a Suppiler)。这很好,因为如果将来您的Provider实现在构建时需要某种配置,这个 lambda 可以处理。如果您的提供者是无状态的,您可以避免更改Providers.provider()为 a val,其中每个枚举类型只会创建一次。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java