如何确定类型参数的方差?

2024-04-28

灵感来自Scala 中协变和逆变的现实示例 https://stackoverflow.com/questions/5277526/real-world-examples-of-co-and-contravariance-in-scala我认为更好的问题是:

在设计库时,在确定类型参数应该是协变还是逆变时,您是否应该问自己一组特定的问题?或者你应该让一切保持不变,然后根据需要进行更改?


嗯,很简单,有道理吗?想想里氏替换。

协方差

If A <: B,通过一个有意义吗?C[A]其中一个C[B]是期待?如果是的话,就做它C[+T]。经典的例子就是不可变的List,其中一个List[A]可以传递给任何期待List[B], 假设A是一个子类型B.

两个反例:

可变序列是不变的,因为否则可能会出现类型安全违规(事实上,Java 的协变Array很容易受到这样的事情的影响,这就是为什么它在 Scala 中是不变的)。

不可变的Set是不变的,尽管它的方法与不可变的方法非常相似Seq。区别在于contains,它是在集合上键入的并且是非类型化的(即接受Any)在序列上。因此,即使可以使其成为协变,但对特定方法增加类型安全性的渴望导致选择不变性而不是协变。

逆变

If A <: B,通过一个有意义吗?C[B]其中一个C[A]是期待?如果是的话,就做它C[-T]。经典的例子是Ordering。虽然一些不相关的技术问题阻止了Ordering从逆变性来看,直观的是任何可以订购超类的东西A也可以订购A。它遵循Ordering[B],对类型的所有元素进行排序B,一个超类型A,可以传递给期待的东西Ordering[A].

而斯卡拉的Ordering不是逆变的,Scalaz http://code.google.com/p/scalaz/'s Order http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/scalaz/Order.scala.html正如预期的那样是逆变的。 Scalaz 的另一个例子是Equal http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/scalaz/Equal.scala.html trait.

混合方差?

Scala 中混合方差最明显的例子是Function1(以及 2、3 等)。它接收的参数是逆变的,返回的参数是协变的。但请注意,Function1是用于很多闭包的东西,闭包被用在很多地方,这些地方通常是Java使用(或将使用)单一抽象方法类的地方。

因此,如果您遇到 SAM 类适用的情况,那么这可能是混合逆变和协方差的地方。

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

如何确定类型参数的方差? 的相关文章

随机推荐

  • 字符串变量可能尚未初始化(错误指向第 34 行)

    我一直在尝试让字符串初始化 但无济于事 我已经尝试了我遇到的所有解决方案 我不确定是因为我的无能还是因为我需要一个新的解决方案 我已经解决了程序的逻辑 所以我只需要帮助尝试初始化字符串值 如果有人可以提供帮助 我将不胜感激 P S 诅咒我想
  • nginx工作进程如何共享“监听套接字”

    This http aosabook org en nginx html http aosabook org en nginx html说 工作进程接受来自共享 监听 套接字的新请求 并在每个进程内执行高效的运行循环 我查看了代码 但不明白
  • WPF 应用程序没有“固定到任务栏”选项

    我创建了几个 WPF 应用程序 但是当在 Windows 7 任务栏中右键单击它们时 我只是得到一个 关闭 Windows 选项 通常有一个 固定到任务栏 选项 我不知道它去了哪里 是否有任何需要启用或任何东西 我在用 VS2010 Ble
  • 弱实体是否可以参与与其他表的识别和非识别关系?

    显然 一个弱实体 作为子实体 必须参与一种或多种识别关系 否则它就不会是弱的 但同时 它也可以是非认同关系中的孩子吗 是的 弱实体集可以参与与其他实体的非识别关系entities 我认为 子 是指弱实体集位于关系的决定 多 方的关系 对于弱
  • 如何在 Chrome/Safari 中调试 EJS 代码

    我正在将 EJS 模板与 CanJS 一起使用 并正在寻找一种调试我的 EJS 代码的方法 目前 firebug 可以向我显示 EJS 中的语法错误 但在其他浏览器中 我看不到任何内容 我需要非常仔细地检查我的 EJS 文件来解决错误 我在
  • C#“as”与“()”转换[重复]

    这个问题在这里已经有答案了 为什么在这种情况下兼容引用类型之间的转换会编译 Excel 2010 Net 4 5 using Excel Microsoft Office Interop Excel Excel Application ex
  • 无约束类型参数错误

    我正在尝试将 glium 与 cgmath 连接起来 下列的这个答案 https stackoverflow com a 40028032 5397009 我已经实现了ToArray要转换实例的特征cgmath Matrix4转换成 gli
  • 如何隐藏我的应用程序但不关闭/完成它

    我想让用户通过隐藏它但不完成它来离开我的应用程序 我可以在主要活动中调用 finish 但这需要一些时间 这不利于用户体验 因此更好的选择可能是隐藏它 只是我不知道如何实现它 感谢您的所有回答 我不想在后台做某事 因为我已经有服务了 在我的
  • Tkinter 和 Tix 的颜色图表

    我想要可视化一些基本颜色 这样我就可以为我的配色方案选择合适的颜色 我在任何地方都找不到颜色图表 因此修改了示例来显示它 这是一个好方法吗 import Tix as tk import tkinter tix as tk for Pyth
  • 如何将任务并行库与 DataReader 结合使用

    我经常用数据填充数据读取器并像这样填充 UI using SqlConnection conn new SqlConnection myConnString using SqlCommand comm new SqlCommand Sele
  • 更改 Android 的 CalendarView 小部件中选定日期的颜色

    如何更改 android 提供的 CalendarView 小部件中所选日期的颜色 我似乎在文档中没有找到任何方法 I can change the VerticalBars using setSelectedDateVerticalBar
  • Java:如何将哈希图插入 MongoDB?

    我有一个哈希图 我试图将其插入到 MongoDB 版本 3 6 中 我知道 insertMany 方法 它只接受文档列表 我无法创建列表 因为我的数据中有重复项 我想删除它们 这就是我创建哈希图的原因 有什么办法可以将 hashmap 插入
  • 使用 gnu make 正确构建 git 子模块

    我目前尝试编写一个 Makefile 来正确构建一个包含 git 子模块的项目 该子模块有自己的一组 makefile 并一次生成多个目标 包括一些库 该 Makefile 应具有以下属性 即使使用并行构建 也不要重建两次子模块 当子模块代
  • Linq:Entity Framework Core 中的 Join 与 Include/ThenInlude

    我正在开发一个使用 SQL Server 和 EF Core v3 的项目 我有 4 个彼此相关的表 这是我的表格方案 我针对这些表编写了 2 个 Linq 查询 其中一个使用像这样的连接 var result from emailTemp
  • 我的 self.view 尺寸错误

    我的视图尺寸错误 我仅运行横向 但视图报告纵向尺寸 视图宽度 768 000000 高度 1024 000000 有任何想法如何解决这个问题吗 我尝试过使用自动旋转 BOOL shouldAutorotateToInterfaceOrien
  • Outlook 代码中的 Excel FilePicker 对话框在后台打开

    我开发了一个 Outlook 宏 让用户选择并打开 Excel 文件 文件对话框在后台打开 对于用户来说 Outlook 应用程序似乎被卡住了 而它只是在等待用户在所有其他窗口后面的文件选择器对话框中选择文件 Dim SigFolder2
  • 无论如何,HTML 表格都不适合整个屏幕

    基本上 我的网站上有一个表格无法 100 适应浏览器屏幕的宽度 即使我将宽度更改为 110 它也只是与右侧重叠 但左侧仍然有一个边距空间 表格的外部空间 我希望表格从左到右完全压在浏览器屏幕上 根本没有空间或边框 我该怎么做呢 我已经尝试了
  • 响应式 CSS 背景图片

    我有一个网站 g floors eu 我想让背景 在CSS中我为内容定义了一个背景图像 也具有响应能力 不幸的是 除了我能想到的一件事之外 我真的不知道如何做到这一点 但这是一个解决方法 创建多个图像 然后使用 css 屏幕大小来更改图像
  • 应用程序域和线程

    引用MSDN的一段话 http msdn microsoft com en us library 6kac2kdh aspx http msdn microsoft com en us library 6kac2kdh aspx 一个或多个
  • 如何确定类型参数的方差?

    灵感来自Scala 中协变和逆变的现实示例 https stackoverflow com questions 5277526 real world examples of co and contravariance in scala我认为