如何在设计业务应用程序时使用协方差和反方差?

Mic*_*ael 16 scala covariance contravariance

我知道如何使用co-contravariance标准库(例如集合和特质Function)我不知道如何co-contravariance在"现实世界"的业务应用程序设计中使用.

Kev*_*ght 23

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

trait Function1[-T1, +R]
Run Code Online (Sandbox Code Playgroud)

哪个是参数的逆-变量(+),以及返回类型的协变量().

为什么?

想象一下,你有这些课程:

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

class Enemy { ... }
class Dalek extends Enemy { ... }
Run Code Online (Sandbox Code Playgroud)

如果你有一个方法,作为参数,一个Doctor => Enemy函数; 那么可以提供一个实例TimeLord => Enemy.它仍将接受实例Doctor.

所以TimeLord => Enemy是一个子类Doctor => Enemy,因为TimeLord是一个超类Doctor,它的逆变该参数.

同样,Dalek当你需要一个函数返回一个函数时,返回a的函数是有效的Enemy,因为它Dalek是一个is-anEnemy

所以Doctor => Dalek是一个子类Doctor => Enemy,因为Dalek子类Enemy,这是在该参数.


Kri*_*mbe 9

基本上你想要使用参数多态 (泛型)和继承的任何地方,你可能最终想要声明站点差异 (+/ -),使用站点差异 (通配符),或者更可能两者.

多态类型通常是相当高级的抽象,因此虽然您的域对象可能不需要方差注释,但您编写的用于操作域对象的代码可能需要使用方差注释,至少如果您的域对象是继承的一部分层次结构,似乎非常频繁.

如果你看一下基本上任何库或框架,你会发现经常使用方差注释.如果您正确地抽象出"真实世界"的应用程序,那么您可能会编写大量的库来支持它,其中一小部分关键业务逻辑与所有支持基础架构很好地分离.所有支持基础设施的人也可能经常使用方差注释.