扩展Kotlin中的泛型类

时间:2016-06-08 21:08:43

标签: java generics kotlin

让我们说我在Java中有这个示例代码:

public class MyActivityDelegate implements ActivityMvpDelegate

其中ActivityMvpDelegate:

interface ActivityMvpDelegate<V extends MvpView, P extends MvpPresenter<V>>

转换为Kotlin的相同代码看起来像这样

class MyActivityDelegate(private val activity: Activity) : ActivityMvpDelegate<MvpView, MvpPresenter<V>>

当然我在V得到了未解决的引用,我不确定这段代码应该怎么样,在Java中我不必在这里指定泛型..任何提示都会非常感激

1 个答案:

答案 0 :(得分:5)

您的界面声明需要

  • V扩展MvpView
  • V(确切V,而不是其子类型)用作P extends MvpPresenter<V>的通用参数

鉴于此,您无法扩展ActivityMvpDelegate<MvpView, MvpPresenter<V>>,因为无法保证V正好MvpView(同样,在Kotlin中,通用参数不会被隐式继承,您必须重新声明它们比如class SomeClass<T> : SomeInterface<T>)。

但是,您可以将其写为

class MyActivityDelegate(private val activity: Activity) 
: ActivityMvpDelegate<MvpView, MvpPresenter<MvpView>>

或引入另一个通用参数,以便VP的参数仍然相同:

class MyActivityDelegate<T : MvpView>(private val activity: Activity) 
: ActivityMvpDelegate<T, MvpPresenter<T>>

您还可以将界面的通用声明从P extends MvpPresenter<V>更改为P extends MvpPresenter<? extends V>(或使用Kotlin中的out V),您将能够使用{{1}的任何子类型作为参数,包括有界泛型:

V