2016-06-10 91 views
3

返回泛型类的实例,我有一个抽象的泛型类的方法:如何正确覆盖科特林

abstract class BasePresenter<View, Router> { 

    var view: View? = null 
    var router: Router? = null 

    abstract fun OnStart() 
    abstract fun OnStop() 

} 

而且我有它的一个子类:

class NewsListPresenter : BasePresenter<NewsListView, MainRouter>() { 
    override fun OnStop() { 
     // 
    } 

    override fun OnStart() { 
     // 
    } 
} 

另外我有一个类与受保护的抽象方法:

protected abstract fun getPresenter() : BasePresenter<Any?, Any?> 

而且我已经被覆盖在一个子类:

override fun getPresenter(): BasePresenter<Any?, Any?> { 
    return NewsListPresenter() as BasePresenter<Any?, Any?> 
} 

Android Studio突出显示了重写的函数,演员表示“此演员从未成功”。我尝试使用in Any,out Any*,它不起作用。当我尝试使用*时,我无法在最初定义的类中使用getPresenter()方法。 Android Studio抱怨类型不匹配:required without ?,找到BaseFragment。 在Java中,相同的代码可以很好地工作,我不认为这是Kotlin的问题。什么是正确的方式来实现这一点?

回答

0

为此使用BasePresenter<*,*>

docs

星预测

有时你想说,你一无所知的 类型参数,但还是要以安全的方式来使用它。这里的安全方法是 来定义这种通用类型的投影,那个通用类型的每个具体实例都将是该投影的子类型。

科特林提供所谓的星形投影语法此:

对于Foo<out T>,其中T与 上限TUpper一个协变型参数,Foo<*>相当于Foo<out TUpper>。它 表示当T未知时,可以安全地从Foo<*>读取 TUpper的值。对于Foo<in T>,其中T是逆变型 型参数,Foo<*>等效于Foo<in Nothing>。这意味着 没有任何东西可以用Foo<*>以安全的方式写入,当时T是 未知。为Foo<T>,其中T是 上限TUpperFoo<*>不变类型参数是相当于Foo<out TUpper> 用于读取值,并Foo<in Nothing>用于写入的值。如果一个 通用类型有几个类型参数,它们中的每一个都可以独立地投影到 。例如,如果该类型被声明为接口 Function<in T, out U>我们可以想象以下星形突起:

Function<*, String>装置Function<in Nothing, String>; Function<Int, *>表示Function<Int, out Any?>; Function<*, *> 表示Function<in Nothing, out Any?>。注意:星形投影非常类似于Java的原始类型,但是安全。

+0

我在我的问题中描述过。使用星型投影,我无法为'getPresenter()。view'或者'getPresenter()。router')赋值。 Android Studio抱怨类型不匹配。 –

+0

我怀疑你所描述的是一个编译器错误。我建议用一个例子报告问题。作为解决方法,您可以投射由'getPresenter()':'(getPresenter()as BasePresenter ).view = something'返回的'BasePresenter <*, *>'。 – mfulton26

2

“铸造不能成功”的警告在这里是不正确的。警告的正确信息应该是“未经检查的强制转换”,因为此转换可能正确也可能不正确,但通过运行程序无法发现。

在跟踪器中有an issue,实际上前几天是fixed。该修补程序可能会使其成为Kotlin 1.0.3。