gpt4 book ai didi

generics - Kotlin 泛型 : Kotlin does not recognize my class with correct inheritance

转载 作者:行者123 更新时间:2023-12-02 12:55:05 25 4
gpt4 key购买 nike

这是我的简化示例:

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, *>>

(请参阅上面更新的 Kotlin 代码)

然后我不能调用 myInvocation,因为对于那个调用我需要'in IMyView'。
因此,这是一场灾难。我所做的一切都会导致其他问题。这在 Java 中更容易。

最佳答案

您的代码的问题在于,当您设置上限 VIEWMODEL : IMyViewModel<IMyView, *> , 一个类型可以满足这个界限 仅限 如果它实现了IMyViewModelVIEW类型参数替换 正是 IMyView , 没有 IMyView 的子类型被允许(因此 MyViewModel 被拒绝)。换句话说, VIEW is invariant .

由于 Kotlin 允许您在声明站点和使用站点指定类型参数变化,因此您可以通过执行以下操作之一来解决此问题:

  • 制作 VIEW IMyViewModel 的类型参数与声明站点方差协变:
    interface IMyViewModel<out VIEW : IMyView, in ITEM>  
    ^^^
  • 添加 out -IMyViewModel使用现场的投影在 VIEWMODEL上限:
    abstract class MyBaseClass<VIEWMODEL : IMyViewModel<out IMyView, *>>
    ^^^
  • 添加另一个类型参数TMyBaseClass并在 IMyViewModel<T, *> 中使用它:
    abstract class MyBaseClass<T : IMyView, VIEWMODEL : IMyViewModel<T, *>>
    class MyMainClass: MyBaseClass<myView, MyViewModel>()
  • 关于generics - Kotlin 泛型 : Kotlin does not recognize my class with correct inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45436451/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com