我是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”,我如何使用该类型?我可以做一些在子类中允许而在基类中不允许的事情。如果这是一个协变参数,这就没有问题了,子类继承了基类的所有内容。
我弄丢了对吧?...希望有人能帮帮我。
首先,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