【问题标题】:Extending generic class in Kotlin在 Kotlin 中扩展泛型类
【发布时间】:2016-06-08 21:08:42
【问题描述】:

假设我有这个 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 的确切声明吗?
  • 是的,是的,它可以编译

标签: java generics kotlin


【解决方案1】:

您的接口声明要求这样做

  • V 扩展 MvpView
  • V(确切地说是V,不是它的子类型)用作P extends MvpPresenter&lt;V&gt; 的通用参数

鉴于此,您不能扩展 ActivityMvpDelegate&lt;MvpView, MvpPresenter&lt;V&gt;&gt;,因为不能保证 V 完全是 MvpView(此外,在 Kotlin 中,泛型参数不是隐式继承的,您必须像 class SomeClass&lt;T&gt; : SomeInterface&lt;T&gt; 一样重新声明它们)。

你可以写成

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&lt;V&gt; 更改为P extends MvpPresenter&lt;? extends V&gt;(或在Kotlin 中使用out V),您将能够使用V 的任何子类型作为参数,包括有界通用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多