首页 > 解决方案 > 如何在泛型接口中引用实现类

问题描述

假设我想定义一个接口,该接口将描述包含相似对象的任何对象树结构。一个明显的实现是:

interface HasChildren {
    val children: Sequence<HasChildren>
}

class Branch(val children: Sequence<Branch>) : HasChildren

或多或少明显的问题是,虽然 a Branch must always, in turn be的子级Branch已经通过接口丢失,我必须明确地将它们类型转换回来。

有没有办法,类似于SelfSwift:

protocol HasChildren {
    let children : Sequence<Self> { get }
}

不丢失实现类类型?

标签: kotlin

解决方案


这称为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++,它在那里被称为“奇怪地重复出现的模板模式”


推荐阅读