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,这是协在该参数.