Kotlin 泛型问题

下面一段代码,Java 中不会报错,Kotlin 中却报错,请问如何解决?
就是我不想关心父类有哪些泛型参数,在Java中直接继承就好了,在Kotlin中怎么做呢?

Java
clipboard.png
Kotlin
clipboard.png

错误内容:
One type argument expected for class BaseActivity<P : BasePresenter<, >> defined in kotlin.ui.other in file OtherActivity.kt

尝试过使用 Any 和 星投射 ,也报错,如下:
clipboard.png

clipboard.png

阅读 8.5k
4 个回答

应该写成

class OtherActivity:BaseActivity<BasePresenter<*, *>>

java中是一种泛型省略的写法,应该是kotlin不支持这样省略吧

理解这个问题,要先理解Kotlin泛型,Kotlin语言中使用协变和逆变处理泛型,类似C#。当前这个问题的解决方案使用两个*代替Any即可。

完全搞懂Kotlin泛型,请关注微信公众号 欧阳锋工作室,查看文章 Kotlin语言中的泛型设计哲学

abstract class BasePresenter<V, E> {}

abstract class BaseActivity<P: BasePresenter<*, *>> {}

class OtherActivity<P: BasePresenter<*, *>>: BaseActivity<P>() {
}

你 BaseActivity定义了P的泛型 必须继承BasePresenter
很显然 Any 和 * 都不能认为一定继承BasePresenter

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进