Scala 订单、部分或订单的差异
根据文档,Scala 订单、部分或订单的差异,scala,variance,Scala,Variance,根据文档,PartiallyOrdered[A]在A中是协变的,而Ordered[A]在A中是不变的(但过去是协变的) 为什么有序[A]在A中总是协变的?这不是明显违反了替代原则吗 为什么有序[A]在A中不能是逆变的?例如,这将允许将有序[Traversible[Char]]键入为有序[StringBuilder]。我不认为这会有什么问题 我无法理解中tryCompareTo的签名。看起来该参数可以是A的任何超类型的实例。您不能通过调用tryCompareTo[any](任何内容)传入任何对象吗
PartiallyOrdered[A]
在A
中是协变的,而Ordered[A]
在A
中是不变的(但过去是协变的)
为什么有序[A]
在A
中总是协变的?这不是明显违反了替代原则吗
为什么有序[A]
在A
中不能是逆变的?例如,这将允许将有序[Traversible[Char]]
键入为有序[StringBuilder]
。我不认为这会有什么问题
我无法理解中tryCompareTo
的签名。看起来该参数可以是A
的任何超类型的实例。您不能通过调用tryCompareTo[any](任何内容)
传入任何对象吗?如果是这样,那么方法签名如何比tryCompareTo(that:any)
更好
从逻辑上讲,有序集是偏序集的一个子类,但Scala类似乎并不反映这种关系。这是因为Ordered[A]
在A
中不能协变,因为PartiallyOrdered[A]
可以协变吗?查看,我没有发现任何与Ordered
相关的协变信息
编辑:进一步查看,并在文档中找到一些已排序的不再是协变的
对于PartiallyOrdered
中的tryCompare
情况,签名对传递的参数设置了更多限制:
def tryCompareTo [B >: A] (that: B)(implicit arg0: (B) ⇒ PartiallyOrdered[B]): Option[Int]
这里隐式的
arg0
意味着被视为一个PartiallyOrdered[B]
实例,因此它可以访问此特征中定义的所有方法。感谢您的回答。我想我明白了,在盯着签名看了一会儿之后。关于有序[A]的方差有什么见解吗?我还不会编辑答案,因为我不确定这一点,但我认为这是因为你不能确定Ordered[A]
等于Ordered[B]
,即使B