在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中,我不必指定泛型在这里..任何提示将不胜感激
你的接口声明要求
-
V
扩展MvpView
-
V
(正好是V
,不是它的子类型)用作P extends MvpPresenter<V>
一般参数,P extends MvpPresenter<V>
鉴于此,不能扩展ActivityMvpDelegate<MvpView, MvpPresenter<V>>
,因为不能保证V
正好是MvpView
(另外,在Kotlin中,泛型参数不是隐式继承的,你必须像class SomeClass<T> : SomeInterface<T>
那样重新声明它们class SomeClass<T> : SomeInterface<T>
)。
但是,你可以把它写成
class MyActivityDelegate(private val activity: Activity) : ActivityMvpDelegate<MvpView, MvpPresenter<MvpView>>
或者引入另一个泛型参数,这样V
和P
的参数仍然是一样的:
class MyActivityDelegate<T : MvpView>(private val activity: Activity) : ActivityMvpDelegate<T, MvpPresenter<T>>
你也可以改变你的接口的泛型声明从P extends MvpPresenter<V>
到P extends MvpPresenter<? extends V>
P extends MvpPresenter<? extends V>
(或在Kotlin中使用out V
),你将能够使用V
任何子类型作为参数,包括有界泛型:
class MyActivityDelegate<T : MvpView>(private val activity: Activity) : ActivityMvpDelegate<MvpView, MvpPresenter<T>>