首页 > 解决方案 > 在 Kotlin 中使用泛型强制更具体的子类类型

问题描述

我正在开发一个具有一些相互关联的接口的库。

主要例子是ViewModel<M: Model, W: Widget>. 然后我们有一个模型接口和一个小部件接口。

小部件接口有一个方法,它接受一个 ViewModel 对象,然后使用它来配置自己。

abstract fun configure(viewModel: ViewModel<M: Model, W: Widget>)

我正在寻找一种方法使该方法需要 ViewModel 的子类实现,而不仅仅是接口。

所以一个 ContainerWidget 需要这个方法:fun configure(viewModel: ContainerViewModel)

我正在模拟的库使用 Swift 并使用其关联的 type 关键字来执行此操作,这表示您可以稍后告诉我们类型。

有谁知道 Kotlin 有这样的选择吗?

非常感谢您的帮助。

abstract class WLViewModel<DataModel : WLDataModel, WidgetType : WLWidget>(val dataModel: DataModel) {
    abstract fun configure(view: WidgetType)
}

interface WLWidget {
    var viewModel: WLViewModel<WLDataModel, WLWidget> 

    fun <M, O : WLDataModel, T : WLWidget> configure(viewModel: M) where M : WLViewModel<O, T>
}

interface WLDataModel

fun WLWidget.create(viewModel: WLViewModel<WLDataModel, WLWidget>) {
    configure(viewModel)
}

标签: javagenericskotlin

解决方案


恐怕没有什么好办法。

传统的 Java 方法通过使用递归类型参数来伪造它。您可以为您的WLWidget接口提供一个实际子类的类型参数,例如WLWidget<T : WLWidget<T>>,然后进行所有连锁更改。但这很丑陋,并不能处理所有情况。(有关更多信息,请参阅 这些 其他 问题。)

已经讨论过向 Kotlin 添加 self 类型,这可能更适合您的情况,但它们还没有出现。


推荐阅读