类继承方面的协变与逆变

2024-03-27

“协变”和“逆变”概念的含义是什么?

给定2个班级,Animal and Elephant(继承自Animal),我的理解是,如果您尝试将大象放入动物数组中,则会出现运行时错误,而发生这种情况是因为大象比动物“更大”(更具体)。但是您能否将一个 Animal 放入 Elephant 数组中,看看如何保证 Elephant 包含 Animal 属性?


你把它搞反了。您可以将大象添加到动物数组中,因为它is anAnimal,并且它保证具有 Animal 需要具有的所有方法。您不能将 Animal 添加到 Elephant 数组中,因为它确实not拥有大象需要具备的所有方法。

维基百科上的文章协变和逆变 http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)对此有一个很好的解释:

在编程语言的类型系统中,如果从类型到类型的运算符保留类型的排序 ≤(将类型从更具体的类型排序到更通用的类型),则该运算符是协变的;如果它颠倒了这个顺序,它就是逆变的。如果这些都不适用,则运算符是不变的。这些术语来自范畴论。

另外,你说 Elephant 类型“更大”,但事实并非如此。动物类型“更大”,因为它包括更具体的类型,例如大象、长颈鹿和狮子。

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

类继承方面的协变与逆变 的相关文章

  • 在 Python 中继承方法的文档字符串

    我有一个带有文档字符串的面向对象层次结构 需要与代码本身一样多的维护 例如 class Swallow object def airspeed self Returns the airspeed unladen raise NotImple
  • Java 从基本构造函数调用基本方法

    如何从 Super Super 调用 Super printThree 在下面的示例中 我改为调用 Test printThree class Super Super printThree I want Super printThree h
  • 我必须初始化简单的类成员变量吗? [复制]

    这个问题在这里已经有答案了 快速初学者问题 Do I have初始化简单的类成员变量 或者是否保证在任何情况下都为它们分配默认值 Example class Foo int i is i 0 or do I need the followi
  • 添加和减去额外的类

    我试图使用java脚本添加和减去一个类我也使用多个类这是我的代码 function enlargegreen document getElementByClassName playlist player className enlarge
  • 为什么抽象方法不能同步?

    我正在读一本来自 CodeRanch 的线程 http www coderanch com t 455033 java programmer SCJP certification abstract synchronized methods
  • 我的车库里真的有一辆车吗? [复制]

    这个问题在这里已经有答案了 我是 Java 编程的新手 正在尝试掌握 OOP 所以我构建了这个抽象类 public abstract class Vehicle 和2个子类 public class Car extends Vehicle
  • 绘制java类的依赖关系图

    嘿嘿 我正在寻找像 JDepend 这样的工具来为 java 类文件绘制图表 JDepend 看起来很好 但它没有从 deps 中解析 deps 也许我只是缺少一些特殊选项 直接输出为 dot 格式或图像会很好 谢谢 你可以试试Java依赖
  • PHP 将样式表添加到标头

    有没有办法在包含头文件后将样式表添加到标题中 假设我们有这样的代码 class content public stylesheets array public function addStylesheets stylesheets if e
  • scala案例类问题

    我有两个关于 案例类的问题 可以用作 case head tail gt 它是如何工作的 意思是 Scala 用于将 List 实例与 case 类进行匹配的流程到底是什么 鉴于我有一个类 MyClass 带有运算符 op 我可以创建一个名
  • 基类和派生类中的数据成员相同

    我是 C 编程新手 我正在阅读继承概念 我对继承概念有疑问 如果基类和派生类具有相同的数据成员 会发生什么 另外请仔细阅读我的代码 如下所示 include stdafx h include
  • 按类型对 std::vector 进行排序

    我当时正在看http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Goi
  • 访问模型字段内的模型实例

    我有一个模型 事件 它具有用户模型 事件的所有者 的外键 该用户可以使用以下 ManyToManyField 邀请其他用户 invites models ManyToManyField User related name invited u
  • Silverlight 与 MVVM 继承:ModelView 和与 Model 匹配的 View

    今天我有一个关于 Silverlight 4 RC MVVM 和继承概念的特殊问题 并正在寻找最佳实践解决方案 我认为我了解 MVVM 背后的基本思想和概念 我的Model对 一无所知视图模型 as the 视图模型本身并不知道View T
  • c++03 初始化具有多个参数的对象数组

    这可能是一个简单的问题 但我正在尝试使用参数化构造函数初始化对象数组 例如 class A public int b c d A int i int j void A A int i int j d rand b 2 i c 3 j voi
  • Python 元类有什么用?

    元类可以用其他方式做不到的事情做什么 Alex Martelli 表示 有些任务如果没有元类就无法完成Python 元类与类装饰器 https stackoverflow com questions 1779372 python metac
  • 如何确定类型参数的方差?

    灵感来自Scala 中协变和逆变的现实示例 https stackoverflow com questions 5277526 real world examples of co and contravariance in scala我认为
  • 当字符串和类都是引用类型时

    这是我上次面试的情况 问题 字符串存储在哪里 Answer 堆因为它是引用类型 问题 解释一下下面的代码 static void Main string args string one test string two one one one
  • 如何从 __subclasses__ 中删除类?

    当从类继承时 子类可以通过父类访问 subclasses method class BaseClass pass class SubClass BaseClass pass BaseClass subclasses
  • PHP - 使用大量参数和默认值初始化对象的最佳方法

    我正在设计一个类 它定义一个高度复杂的对象 其中包含大量 50 大部分可选参数 其中许多参数都有默认值 例如 type foo width 300 interactive false 我试图确定设置构造函数和实例 类变量的最佳方法 以便能够
  • 线程/进程/任务之间有什么区别?

    线程 进程 任务之间有什么区别 Process 进程是正在执行的计算机程序的实例 它包含程序代码及其当前活动 根据操作系统 OS 进程可能由同时执行指令的多个执行线程组成 基于进程的多任务处理使您能够在使用文本编辑器的同时运行 Java 编

随机推荐

  • 仅更新 DateTime 的日期部分

    我正在使用 SQL Server 2008 我在数据库中有一个日期时间 值为 10 4 2012 8 03 00 AM 如何仅更新日期部分 字段名称为 dTime 我想将日期更新为 10 5 2012 并保持时间不变 UPDATE tabl
  • 如果 bean 已经使用 @ConfigurationProperties 注解,@EnableConfigurationProperties 会有什么区别?

    Spring Boot 文档 https docs spring io spring boot docs 2 1 3 RELEASE reference html boot features external config html boo
  • 设置自定义 Maven 2 属性的默认值

    我有一个 Maven pom xml 其中包含一个我希望能够在命令行上控制的插件 一切工作正常 除了即使在网上搜索了一段时间后 我也不知道如何为我的控件属性设置默认值
  • 如何将 Cocoa 坐标从左上角 == 原点转换为左下角 == 原点

    我使用 CGWindowListCopyWindowInfo 来获取所有窗口的列表 它根据原点为我提供每个窗口的坐标top left屏幕的 如果我使用 NSWindow 的 setFrame 方法 则坐标基于原点左下方屏幕的 从一种方式转换
  • WPF 列表框滚动条不起作用

  • Backbone 可以逆序渲染集合吗?

    我正在使用 Signalr 中心来订阅服务器上的事件 事件被分派到集线器 它成功地将项目添加到 Marionette CollectionView 这又被呈现到表格中 因为事件表本质上是一个记事本 所以我希望事件按相反的顺序排列 并且最好只
  • 成本计算器应用程序的设计模式?

    我有一个问题 我之前曾尝试寻求帮助 但当时无法解决它 所以我现在尝试简化问题 看看是否可以获得更具体的帮助 因为它让我发疯了 基本上 我有这个应用程序的工作 更复杂 版本 它是一个项目成本计算器 但因为我同时尝试学习更好地设计我的应用程序
  • iPhone 后台线程问题

    我正在使用后台线程来更新我的标签之一 我正在使用以下代码 但在 iOS 4 0 中 我了解到应用程序会保存其状态并进入后台 我的应用程序也做了这项工作 但是当我隐藏应用程序时 我正在使用的线程停止工作 并在我重新打开它时从我离开的位置恢复
  • IE8 支持哪些 Javascript 版本?

    根据维基百科 IE8仅支持Javascript 1 5 所以他们说 IE8 完全忽略了 Javascript 版本 1 6 1 7 1 8 和 1 9 我应该相信吗 这是真的吗 好吧 实际上 IE 的实现叫做JScript http msd
  • runBlock 发生后延迟 SKAction.sequence 中的下一个操作(Swift)?

    The duration财产为moveTo在 a 内时不被跟随runBlock 允许序列中的后续操作立即执行 而该操作应该只在之后执行duration秒 代码A 正确执行的序列 let realDest CGPointMake itemA
  • Ansible - 如何将 selectattr 与不同键的 yaml 一起使用

    我正在努力尝试做一件简单的事情 我认为这应该很容易 解析 yaml 并过滤 Ansible 中的某些键 我的 yaml 文件如下所示 vm vm1 ip 10 10 10 1 vm vm2 ip 10 10 10 2 test vm som
  • 清空表数据并重置 IDENTITY 列

    我在 SQL Server 中创建了一个包含几个表的数据库 我运行了一些测试 现在准备部署我的解决方案 问题是 表中有各种各样的数据 我想删除通过测试创建的所有表的每一行 并将主键放回到零 我尝试删除它不会重置主键索引 并且删除只是破坏了表
  • 如何使带有换行符的行内元素的背景延伸到每边最远的边缘?

    即使使用容器 我也不知道如何做到这一点 内联容器的背景将缩小到每行的大小 内联块容器将就像块元素一样 浮动似乎也不起作用 Example div style width 250px margin left 0px border 2px so
  • 如果在python中单独写一个变量名会发生什么?

    最近我开始好奇以下伪 python 代码的第 2 行发生了什么 def my fun foo bar foo return foo bar 我开始感兴趣的原因是我正在尝试 Light Table 并尝试在 foo 上放置一个手表 它似乎导致
  • C++ 将函数指针转换为唯一的“哈希”键

    Se 原始问题在底部 我想我明白你们现在在说什么 因为成员函数指针的内部结构是编译器 机器特定的 所以我实际上不可能做到这一点 因此 即使它在我测试时有效 我也不能保证它在其他编译器 机器上也有效 那么还有其他方法可以实现我想要的吗 我有一
  • tr1::reference_wrapper 有什么用?

    最近我读了斯科特 迈耶斯 Scott Meyers 的优秀著作有效的C https rads stackoverflow com amzn click com 0321334876书 在最后一篇技巧中 他介绍了 TR1 的一些功能 我通过
  • 如何通过代理 servlet 捕获服务器发送事件 (SSE)

    我们维护2个应用程序 application1在具有proxyservlet的glassfish服务器中运行 application2在同一台机器上与jetty服务器一起运行 我的 UI 代码发出请求 gt app1 proxyservle
  • SQLiteAssetHelper NullPointerException 仅在某些设备上

    我正在使用 SQLiteAssetHelper 库来处理我的 App DB 操作 它对于我测试过的几乎所有手机都运行良好 然而 一些使用 Android 2 3 3 2 3 7 的用户报告在调用打开数据库时崩溃 我怀疑这是由于第一次从资产文
  • 添加类以在 Laravel 上选择元素

    我有这个问题 我找不到在此下拉框中添加类属性的方法 Form select bancada Bancada lists nombre idBancada 我尝试过各种语法 但无法让它工作 有什么建议么 谢谢 使用第四个参数向元素添加属性 F
  • 类继承方面的协变与逆变

    协变 和 逆变 概念的含义是什么 给定2个班级 Animal and Elephant 继承自Animal 我的理解是 如果您尝试将大象放入动物数组中 则会出现运行时错误 而发生这种情况是因为大象比动物 更大 更具体 但是您能否将一个 An