我知道在标准库(例如集合和特征co-
)中使用contravariance
和Function
的情况,我想知道在设计“现实世界”业务应用程序时如何使用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 => Enemy
是Doctor => Enemy
的子类,因为TimeLord
是Doctor
的超类,因此它与该参数相反。同样,当需要返回某些
Dalek
的函数时,返回Enemy
的函数是有效的,因为Dalek
是-an Enemy
所以
Doctor => Dalek
是Doctor => Enemy
的子类,因为Dalek
是Enemy
的子类,它在该参数中是协变的。关于scala - 在设计业务应用程序时如何使用协方差和反方差?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5277526/