kotlin - 如何在泛型接口中引用实现类
问题描述
假设我想定义一个接口,该接口将描述包含相似对象的任何对象树结构。一个明显的实现是:
interface HasChildren {
val children: Sequence<HasChildren>
}
class Branch(val children: Sequence<Branch>) : HasChildren
或多或少明显的问题是,虽然 a Branch
must always, in turn be的子级Branch
已经通过接口丢失,我必须明确地将它们类型转换回来。
有没有办法,类似于Self
Swift:
protocol HasChildren {
let children : Sequence<Self> { get }
}
不丢失实现类类型?
解决方案
这称为F-bounded polymorphism(这篇文章是针对 Scala 的,但这不重要;我找不到我喜欢使用 Java 或 Kotlin 的解释,但概念完全相同):
interface HasChildren<T : HasChildren<T>> {
val children: Sequence<T>
}
class Branch(override val children: Sequence<Branch>) : HasChildren<Branch>
如果您熟悉 C++,它在那里被称为“奇怪地重复出现的模板模式”。
推荐阅读
- javascript - 刷新(不重新加载)iFrame
- json - 提供“--isolatedModules”标志时无法编译命名空间 - WebStorm
- javascript - 使用 react-select 使用 bootstrap 4 创建标记
- css - 在浮动中垂直和水平居中对齐
- json - jq 在许多单独的文件中创建输出
- jquery - 为什么 jautocalc.js 不能在 asp.net 内容页面上工作?
- html - 与使用类相比,我如何衡量内联 css 的效率
- javascript - 如何从元素执行值
- angular - 如何在 Angular 6 中正确运行 webix 文件管理器
- c# - 表中每个员工每年都有一条记录。如果今年未记录员工数据,应该通过什么查询来更改可见性