让我们说我在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中我不必在这里指定泛型..任何提示都会非常感激
答案 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>>
或引入另一个通用参数,以便V
和P
的参数仍然相同:
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