泛型:抽象类和子类型

标签 generics kotlin

我有一个名为 presenter 的抽象类:

abstract class Presenter<V> {

    fun bind(view: V) {
        ...
    }

    ...
}

我有这些演示者的实现:

class FolderChooserPresenter : Presenter<FolderChooserView>() {
    ...
}

查看指定点调用bind方法的类:

class FolderChooserActivity : BaseView(), FolderChooserView {

    @Inject lateinit var presenter: FolderChooserPresenter

    // method of baseview
    override fun onStart() {
        super.onStart()

        presenter.bind(this)
    }
}

我想要实现的是为像 FolderChooserActivity 这样的类创建一个基类,它会自动调用绑定(bind)方法。
在所有实现中一遍又一遍地重复这些调用感觉很愚蠢。

我的方法是使用一个抽象类来扩展调用绑定(bind)方法的 BaseView。但这显然行不通,因为绑定(bind)类需要实现而不是抽象类。

最佳答案

您可以将两个通用参数添加到您的 BaseView 类,并将 this 转换为 V:

open class Presenter<V> {
    fun bind(v: V) {}
}

open class BaseView<P, V> where P : Presenter<V> {
  lateinit var presenter: P

  fun onStart() {
    p.bind(this as V)
  }
}

你会像这样使用它

class FolderPresenter : Presenter<FolderChooserView>() {

}

class FolderChooserView : BaseView<FolderPresenter, FolderChooserView>()

不幸的是,由于未经检查的转换,如果混淆了参数,您将无法从编译器获得任何帮助:

class SomeOtherView : BaseView<SomeOtherPresenter, FolderChooserView>()

关于泛型:抽象类和子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526021/

相关文章:

c# - 如何返回具有泛型类型的类实例作为具有泛型类型的接口(interface)?

spring-boot - 当我在响应正文中返回值时,Spring WebFlux 抛出 'producer' 类型未知

android - X 轴标签未显示在折线图中 (MpAndroidChart)

c# - 如何通过删除通用参数从 typeof(List<T>) 获取 typeof(List<>)

Android 检测到不成功的电话并稍后再试

gradle - 如何在Gradle 4.10.3中使用Kotlin Gradle DSL从sourceSets中获取 'allJava'?

java - 如何使用 Kotlin 构建 cordova 项目

java - 通过 varargs 参数可能造成堆污染

java - 具有参数化集合的泛型?

c# - 通用集合类?