在许多面向对象编程语言中,类型可以是共同的、对的或不变的.大多数(如果不是所有这些语言)都能够让变量发生变异,也就是说,它们不是完全不变的语言。
我在这就是答案中看到,至少在Scala中,协变类型既不能出现在对变位,也不能出现在协变位置。
这个答案(事实上,我在互联网上发现的所有类似的例子)的问题是,它依赖于可变性来显示上述事实的证据。
所以我的问题是:
发布于 2019-09-23 16:43:12
在不变的环境中,即使是方差的概念也有意义吗?
是的;亚型的存在与不可变性无关。
每一种推测的、完全不变的OOP语言(例如,所有这些语言)是否都是协变的,而不管它们在何处使用(即作为函数输入类型/函数输出类型)?
作为一个简单的演示,为什么函数输入类型不能是协变量的,而不涉及可更改性(使用Scala语法):
val f: Int => Int = x => 2 * x
val g: Any => Int = f // allowed by covariance
g("") // what should this do?规则仍然是一样的:“生产者扩展(协变),消费者超级(反变)”。函数是它的输入类型的使用者。
发布于 2019-09-23 16:46:30
方差与可变性无关。它出现在参数多态性和亚型的交集处。
最古老的方差示例实际上是函数式编程的一个例子,即:函数类型何时是另一种函数类型的子类型?
如果一个函数类型的输入至少和超级类型一样一般,并且它的输出至少和超级类型一样具体的话,那么函数类型就是另一个函数类型的子类型。
换句话说,函数在它们的输入中是反变的,在它们的输出中是协变的。
发布于 2019-09-23 15:47:02
假设您有一个函数,它接受一个列表/数组和一个比较函数,并返回一个新的排序项。如果我有一个整数对象列表,我需要一个可以对整数进行排序的函数:compare(a,b)。对于无方差类型,我要么指定函数必须接受整数compare(a: Integer, a:Integer),要么必须接受一个特定的超级类型的整数,例如compare(a: Object, a:Object)。但是,如果我有一个定义为compare(a: Number, b: Number)的比较呢?应该可以用,但我两种情况下都不能用。因此,我们需要能够指定比较函数需要能够处理整数或任何Integer的超类,即对方差。
https://softwareengineering.stackexchange.com/questions/398770
复制相似问题