首页 > 解决方案 > 我可以从接口中的另一个泛型声明中解析泛型类型吗?

问题描述

期望你有这样的界面:

interface MyInterface<T : BaseClass<I>, I> {
    fun someMethod(param: I) : T
}

如您所见,我IsomeMethod. 但实际上我不想像这样I实现这个接口时声明:

class BaseClassImpl : BaseClass<OtherClass>

class Impl : MyInterface<BaseClassImpl, OtherClass> {
    override fun someMethod(param: OtherClass) {
        TODO("Not yet implemented")
    }
}

从理论上讲,编译器应该可以I在没有额外声明的情况下解析泛型,因为它是由BaseClassImpl. 所以MyInterface<BaseClassImpl>应该已经提供了足够的信息来解决必要的泛型someMethod()

有没有办法在 Kotlin 中实现这一点?

标签: kotlin

解决方案


在 Kotlin 中这是不可能的。语言规范说明

Kotlin 支持两种类型推断。

  • 本地类型推断,用于在语句/表达式范围内本地推断表达式的类型;
  • 函数签名类型推断,用于推断函数返回值和/或参数的类型。

它不能根据另一个泛型参数的类型推断一个泛型参数的类型(特别是对于超类型声明,因为它是构建类型约束系统的基础)。

您可以声明类型别名(对于 each T)以避免I每次实现此接口时重复:

typealias MyInterfaceForBaseClassImpl = MyInterface<BaseClassImpl, OtherClass>

class Impl : MyInterfaceForBaseClassImpl {
    override fun someMethod(param: OtherClass) : BaseClassImpl {
        //...
    }
}

推荐阅读