为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2021-08-13 15:31:02
我正在尝试在 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,其中每个枚举类型只会创建一次。


查看完整回答
反对 回复 2021-08-13
  • 2 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信