kotlin - 我可以从接口中的另一个泛型声明中解析泛型类型吗?
问题描述
期望你有这样的界面:
interface MyInterface<T : BaseClass<I>, I> {
fun someMethod(param: I) : T
}
如您所见,我I
在someMethod
. 但实际上我不想像这样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 支持两种类型推断。
- 本地类型推断,用于在语句/表达式范围内本地推断表达式的类型;
- 函数签名类型推断,用于推断函数返回值和/或参数的类型。
它不能根据另一个泛型参数的类型推断一个泛型参数的类型(特别是对于超类型声明,因为它是构建类型约束系统的基础)。
您可以声明类型别名(对于 each T
)以避免I
每次实现此接口时重复:
typealias MyInterfaceForBaseClassImpl = MyInterface<BaseClassImpl, OtherClass>
class Impl : MyInterfaceForBaseClassImpl {
override fun someMethod(param: OtherClass) : BaseClassImpl {
//...
}
}
推荐阅读
- javascript - Fabric.js中特定字符的文本高度
- ruby - 我的 jekyll 博客一直在尝试使用旧的 jekyll,我不知道为什么
- javascript - how to compare two arrays together if they have the same ownerId
- ruby-on-rails - 属于多态路由的用户关联
- python - 如果在 Python 中满足另一个条件,则循环“i for i in..”
- c++ - 使用带有 linux 的 std::filesystem 是坏的还是文件系统树无法访问?
- mysql - 如何选择另一个表中具有最大值的id
- html - 为什么 Github Pages 不提供我的文档?
- loops - 如何在 MIPS 汇编语言的循环中添加多个条件?
- java - 用自己的 Executor 替换默认的 SimpleAsyncTaskExecutor 有什么缺点和风险