当前位置: 首页 > 知识库问答 >
问题:

scala中的逆变

仲和韵
2023-03-14

我是Scala的新手。我在想整个逆变关系是如何运作的。我了解协方差和不变量的概念,我也知道如何在实践中实现它们。我还理解了逆变(协方差的反向)的概念,以及它是如何在Scala中的Function1特性中实现的。它为您提供了一种抽象,而无需为不同的类重新定义Function1实现。但是,我还是不完全明白,奇怪吗?现在,我就快到了…我如何用逆变来解决下面的问题:

class GarbageCan[-A] {

  def doSomething(a: A): Unit ={
    // do something with 'a' of subtype that is not possible with the supertype
  }

}

def setGarbageCanForPlastic(gc: GarbageCan[PlasticItem]): Unit = {

}

上面的例子摘自http://blog.kamkor.me/covariane-and-contravarianc-in-scala/。关于这个问题的一个很好的解释。层次结构如下:Item(基类)->PlasticItem(子类)->PlasticBottle(子类的子类)

setGarbageCanForPlastic函数接受类型为PlasticItem的GarbageCan。因为参数化类型是逆变的,所以下面的语句是完全合法的:

setGarbageCanForPlastic(new GarbageCan[Item])

现在,doSomething函数接受一个反向的类型参数。如果我不知道该类型是基类“Item”还是子类“PlasticItem”,我如何使用该类型?我可以做一些在子类中允许而在基类中不允许的事情。如果这是一个协变参数,这就没有问题了,子类继承了基类的所有内容。

我弄丢了对吧?...希望有人能帮帮我。

共有1个答案

孟健
2023-03-14

首先,DoSomething方法实际上除了本质上丢弃A之外不能做任何事情,因为它不知道A是什么。为了使其更有用,您需要一个绑定,如类garbageCan[-a<:Item]

现在,假设SetGarbageCanforPlastic(gc)调用gc.DoSomething(new PlasticItem)。由于GarbageCan[A]中的A是反向的,因此我们有GarbageCan[Item]<:GarbageCan[PlasticItem]<:GarbageCan[PlasticBottle]。实际上,函数调用SetGarbageCanforPlastic(new GarbageCan[Item]))是安全的,因为GarbageCan[Item]DoSomething可以处理包括PlasticItem在内的任何;而调用SetGarbageCanforPlastic(new GarbageCan[PlasticBottle]))是不安全的,因为GarbageCan[PlasticBottle]DoSomething可能无法获取不一定是PlasticItem

 类似资料:
  • 这可能是一个很傻的问题,但我挠头了很久也弄不明白其中的区别。 我正在浏览scala泛型页面:https://docs.scala-lang.org/tour/generic-classes.html 注意:泛型类型的子类型是不变的。这意味着,如果我们有一个stack[Char]类型的字符堆栈,那么它就不能用作stack[Int]类型的整数堆栈。这是不合理的,因为它使我们能够将真整数输入到字符堆栈中

  • 问题内容: 给出以下形式: 我可以使用构造序列化表格: 如何使用JavaScript反序列化上述String并返回哈希值? 例如, 参考:。 问题答案: 您应该使用jQuery BBQ的deparam函数。经过充分测试和记录。

  • NowCoder 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 解题思路 // java private long cnt = 0; private int[] tmp; // 在这里声明辅助数组,而不是在 merge() 递归函数中声明 public int InversePairs(int[] num

  • 问题内容: SciPy或NumPy或其他内置的逆傅立叶变换是否有通用形式的短时傅立叶变换? matplotlib中有pyplot函数,该函数调用,后者调用,后者调用: 但 这是一个辅助功能,可实现204#psd,csd和频谱图之间的通用性。它 不 打算在mlab之外使用 我不确定这是否可以用于STFT和ISTFT。还有什么,还是我应该翻译像这些MATLAB函数一样的东西? 我知道如何编写自己的临时

  • 一、题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 举例分析 例如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对,分别是(7, 6)、(7,5),(7, 4)、(6, 4)和(5, 4)。 二、解题思路 第一种:直接求解 顺序扫描整个数组。每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面

  • 本文向大家介绍python中的逆序遍历实例,包括了python中的逆序遍历实例的使用技巧和注意事项,需要的朋友参考一下 如果你需要遍历数字序列,可以使用内置range()函数。它会生成数列。 range()语法: range(start,end,step=1):顾头不顾尾 正序遍历: range(10):默认step=1,start=0,生成可迭代对象,包含[0, 1, 2, 3, 4, 5, 6