这是我简单的例子:科特林泛型:科特林不承认我的类继承正确
interface IMyView
interface IMyViewModel<VIEW : IMyView, in ITEM> {
fun attachView(view: VIEW)
fun getView(): VIEW?
}
class myView : IMyView
class MyViewModel : IMyViewModel<myView, String> {
override fun attachView(view: myView) {
TODO("not implemented")
}
override fun getView(): myView? {
TODO("not implemented")
}
}
abstract class MyBaseClass<VIEWMODEL : IMyViewModel<out IMyView, *>> : IMyView {
protected lateinit var viewModel: VIEWMODEL
fun myInvocation(): Unit {
viewModel.attachView(this as IMyView)
}
}
class MyMainClass : MyBaseClass<MyViewModel>()
的问题是最后一行,因为MyViewModel未被识别为IMyViewModel。错误消息如下:
Type argument is not within its bounds.
Expected: IMyViewModel<IMyView, *>
Found: MyViewModel
在Java中它工作。我必须适应什么才能让它在Kotlin中也可行?
******更新******
如果使用
abstract class MyBaseClass<VIEWMODEL : IMyViewModel<out IMyView, *>>
(请参见上面的更新科特林代码)
那么我不能叫myInvocation因为那个电话我需要'IMyView'。 因此这是一场灾难。我所做的一切都会导致其他问题。在Java中更容易。
你是对的,那是有效的。但我有IMyViewModel有两个乐趣的附加问题:有趣的attachView(view:VIEW),有趣的getView():VIEW?有趣的attachView(视图:视图)将无法使用,因为它是在那里。我能做什么? – grenzfrequence
@grenzfrequence,那么你只能应用use-site方差,并且你将无法安全地调用'attachView(view:VIEW)',因为'VIEW'没有下界(它可以是任何的子类型'IMyView')。如果这不符合您的用例,您可以尝试将另一个类型参数添加到'MyBaseClass',请参阅已更新的答案。 – hotkey
@grenzfrequence,我检查了更新的问题,并且似乎更新后的答案的最后一点解决了问题。 – hotkey