我知道在标准库(例如集合和特征co-)中使用contravarianceFunction的情况,我想知道在设计“现实世界”业务应用程序时如何使用co-contravariance

最佳答案

经典的示例是函数,将Scala接口用于具有单个参数的函数:

trait Function1[-T1, +R]


参数是逆变的(-),而返回类型是协变的(+)。

为什么?

假设您有以下课程:

class Timelord { ... }
class Doctor extends Timelord { ... }

class Enemy { ... }
class Dalek extends Enemy { ... }


如果您有一个使用Doctor => Enemy函数作为参数的方法;那么可以提供TimeLord => Enemy的实例。它仍然会接受Doctor的实例。

所以TimeLord => EnemyDoctor => Enemy的子类,因为TimeLordDoctor的超类,因此它与该参数相反。

同样,当需要返回某些Dalek的函数时,返回Enemy的函数是有效的,因为Dalek是-an Enemy

所以Doctor => DalekDoctor => Enemy的子类,因为DalekEnemy的子类,它在该参数中是协变的。

关于scala - 在设计业务应用程序时如何使用协方差和反方差?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5277526/

10-12 23:32