Kotlin:覆盖子类型中的通用属性

2024-05-11

我试图编写一些通用代码,但无法摆脱Type of 'PROPERTY' is not a subtype of the overridden property error.

我的代码的简化版本:

abstract class BaseP<V> {
    var view: V? = null
}

abstract class BaseF {
    fun smth() {
        pp.view = this
    }
    abstract val pp: BaseP<BaseF>
}

abstract class SubF: BaseF() {
    abstract override val pp: BaseP<SubF>
    // Error:(20, 30) Type of 'pp' is not a subtype of the overridden property 'public abstract val pp: BaseP<BaseF> defined in BaseF'
}

我发现错误可能是@Suppress-ed,但我怀疑这是最好也是唯一的方法。还有更好的吗?

毕竟我不明白为什么subtypeA<subtypeB>不算作子类型baseA<baseB>,有人可以解释一下吗?


First, SubtypeA<B>是一个子类型BaseA<B>,所以问题出在泛型参数子类型上。

答案在于Kotlin 泛型方差 https://kotlinlang.org/docs/reference/generics.html#variance,这类似于爪哇的 https://dzone.com/articles/covariance-and-contravariance.

为什么不SubtypeA<SubtypeB>算作子类型BaseA<BaseB>?

默认情况下,泛型是不变的,这意味着即使在更简单的情况下,对于一个类A<T>, A<SubtypeB> and A<BaseB>除非方差修饰符另有指定,否则不是彼此的子类型in and out (or Java 通配符 https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html).

可能有两种情况:

  • 如果你只想take T类实例之外的实例A,那么你可以使用out修饰符:A<out T>.

    Here A<SubtypeB>成为的子类型A<BaseB>,因为从A<SubtypeB>你显然可以举个例子BaseB,反之则不然。

  • 如果你只想pass T进入你的类的方法,然后使用in类声明中的修饰符:A<in T>.

    和这里A<BaseB>是一个子类型A<SubtypeB>,因为每个实例A<BaseB>还可以收到SubtypeB进入方法,但反之则不然。

如果你都通过并接受T往返您的班级A<T>,那么唯一的选择是T它是不变的,因此既不A<SubB> nor A<SuperB>是以下子类型A<B>: 否则会导致与上述矛盾。

情况正是如此:在你的BaseP<B>,你们俩都拿了以下物品V并将其放入view财产,所以V只能是不变的,并且BaseP<SubF>不是 的子类型BaseP<BaseF>, 既不是SubP<SubF>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin:覆盖子类型中的通用属性 的相关文章

随机推荐

  • Docker-compose v3 不持久保存 postgres 数据库

    在 docker compose v3 容器关闭并重新启动后 我很难保留 postgres 数据 这似乎是一个常见问题 但经过大量搜索后我无法找到有效的解决方案 我的问题与这里类似 如何使用卷将数据保存在 dockerized postgr
  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 在 Eclipse 工作区中搜索字符串

    如何在完整的eclipse工作区中搜索字符串 我无法在 Eclipse 工作区中找到文本 但是我无法在工作区中找到指定的字符串 在顶层菜单中 选择 搜索 gt 文件搜索 然后在底部附近 在范围内 有一个选项可以选择整个工作区 为您 文件搜索
  • 如何在 Django 1.4 中自定义管理过滤器

    我是 Python 和 Django 开发的新手 我从社区提供的易于阅读的示例中学到了很多东西 但最近我想为 Django 附带的管理控制台实现一个自定义的管理过滤器 我进行了很多搜索 只发现了一些过时的方法来完成它 例如 Django 1
  • 如何将exe异常路由回VB6应用程序?

    我有一个 vb6 应用程序 它将调用 mencoder exe 它是 mplayer 的一部分 用于将某些文件转换为 flv 格式 每当我尝试转换这个 opendivx 文件时 我都会从 mencoder 收到这个奇怪的未处理异常问题 目前
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 如何在 Rails rspec 中测试 cookie 过期时间

    在 rspec 中设置 cookie 有很多困惑http relishapp com rspec rspec rails v 2 6 dir controller specs file cookies http relishapp com
  • 按钮 VisualState Focused 不起作用

    我试图在单击按钮时更改按钮的字体颜色 我尝试了很多不同的方法 但没有一个有效 这是我尝试过的最新方法 我认为应该是答案 但它不起作用 有人可以帮忙吗 PointerOver 工作正常 但单击按钮时 Focused 没有执行任何操作
  • jQuery 提交未触发

    我觉得问这个很愚蠢 但为什么我的 submit 没有发出警报 HTML div class buttonbar style margin left 10 div
  • 免费实时货币换算汇率 xml feed url [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 提供实时更新 xml 数据源以集成到 iPhone 应用程序中的任何链接 您可以尝试这些 xml 文件 http www ecb int
  • 如何对 mongodb/mongoid 脚本进行基准测试,以比较两种不同的查询技术

    您对如何测试两种不同的 mongoid mongodb 查询实现的性能有什么建议吗 要比较的实现与以前的相关 问答 https stackoverflow com questions 10121977 extracting modellin
  • 通过拖动块来选择多个项目

    首先 让我告诉你 我对此感到压力很大 因为我什至不知道概念 方法名称 所以我什至无法在谷歌中搜索它 因为我不知道关键字 但我会尝试我的最好解释一下 请随意修改我的内容和标题 我想要实现的是 我的视图组包含许多子视图 或者它可以是 GridV
  • 为 iPhone SDK 优化绘图(用手指触摸)应用程序

    我正在编写一个使用手指绘制简单图表的应用程序 我让它在大部分情况下都能工作 但现在我正在尝试优化它的性能 当用户快速滑动手指时 我无法捕获足够的触摸事件来绘制平滑的路径 这是我目前的方法 1 我对 UIView 进行了子类化 并向 CGLa
  • 在 ios 中从 XMPP 服务器检索存档的消息

    我正在将 XMPP 功能集成到我的 ios 应用程序中 但遇到了一个无法解决的问题 问题是我无法从服务器获取存档的消息 我的客户能够登录 并且我已经成功测试了多个服务调用 发送 接收消息 获取有关用户的信息 发送后
  • Lodash 和 Underscore.js 之间的差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么有人会更喜欢Lodash http lodash com or 下划线 js http underscorejs org 实用程序库优于其
  • 使用 dockerfile 在 docker 中安装 mongodb 驱动

    我有一个 mongodb docker 容器 我需要另一个安装了 php 和 apache 的 docker 容器 我想从这个容器运行一个 php 脚本并将一些数据发送到 mongodb 容器以将数据保存在 mongodb 数据库中 所以我
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • PowerShell 中的“nohup”相当于什么?

    如何模拟 unix 命令的行为nohup在 PowerShell 中 那是nohup my other nonblocking command 我注意到Start Job命令 但是语法对我来说有点不清楚 gt Start Job my ex
  • Kotlin:覆盖子类型中的通用属性

    我试图编写一些通用代码 但无法摆脱Type of PROPERTY is not a subtype of the overridden property error 我的代码的简化版本 abstract class BaseP