hen*_*rek 6 java generics kotlin
让我们说我在Java中有这个示例代码:
public class MyActivityDelegate implements ActivityMvpDelegate
Run Code Online (Sandbox Code Playgroud)
ActivityMvpDelegate在哪里:
interface ActivityMvpDelegate<V extends MvpView, P extends MvpPresenter<V>>
Run Code Online (Sandbox Code Playgroud)
转换为Kotlin的相同代码如下所示
class MyActivityDelegate(private val activity: Activity) : ActivityMvpDelegate<MvpView, MvpPresenter<V>>
Run Code Online (Sandbox Code Playgroud)
当然我得到了未解决的参考,V我不确定这段代码应该是什么样的,在Java中我不必在这里指定泛型..任何提示都会非常感激
您的界面声明要求
V 扩展 MvpViewV(确切地说V,不是它的子类型)用作通用参数P extends MvpPresenter<V>鉴于这种情况,则无法扩展ActivityMvpDelegate<MvpView, MvpPresenter<V>>,因为不能保证V是完全MvpView(另外,在科特林,通用参数不会隐式继承,你必须redeclarate他们像class SomeClass<T> : SomeInterface<T>).
但是,您可以将其编写为
class MyActivityDelegate(private val activity: Activity)
: ActivityMvpDelegate<MvpView, MvpPresenter<MvpView>>
Run Code Online (Sandbox Code Playgroud)
或引入另一个泛型参数,以便参数V和P仍然相同:
class MyActivityDelegate<T : MvpView>(private val activity: Activity)
: ActivityMvpDelegate<T, MvpPresenter<T>>
Run Code Online (Sandbox Code Playgroud)
您还可以将接口的泛型声明更改P extends MvpPresenter<V>为P extends MvpPresenter<? extends V>(或out V在Kotlin中使用),并且您将能够使用任何子类型V作为参数,包括有界泛型:
class MyActivityDelegate<T : MvpView>(private val activity: Activity)
: ActivityMvpDelegate<MvpView, MvpPresenter<T>>
Run Code Online (Sandbox Code Playgroud)