在 Kotlin 中扩展泛型类

8
假设我有以下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中我不需要在这里指定泛型。任何提示都将不胜感激。


你的Java示例 public class MyActivityDelegate implements ActivityMvpDelegate 看起来不完整(它也无法编译),你确定这是 MyActivityDelegate 的确切声明吗? - miensol
1
是的,它可以编译。 - henorek
1个回答

7

你的接口声明要求:

  • V 继承 MvpView
  • P extends MvpPresenter<V> 的泛型参数必须使用 V(确切使用 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),这样您就可以使用任何 V 的子类型作为参数,包括有界泛型:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接