如何正确覆盖科特林
返回泛型类的实例,我有一个抽象的泛型类的方法:如何正确覆盖科特林
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的问题。什么是正确的方式来实现这一点?
为此使用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
是 上限TUpper
,Foo<*>
不变类型参数是相当于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的原始类型,但是安全。
我在我的问题中描述过。使用星型投影,我无法为'getPresenter()。view'或者'getPresenter()。router')赋值。 Android Studio抱怨类型不匹配。 –
我怀疑你所描述的是一个编译器错误。我建议用一个例子报告问题。作为解决方法,您可以投射由'getPresenter()':'(getPresenter()as BasePresenter).view = something'返回的'BasePresenter '。 –
mfulton26