我知道在标准库中使用co-和contravariance (例如集合和特性Function),我想知道co-和contravariance是如何在“真实世界”业务应用程序的设计中使用的。
发布于 2011-03-11 23:53:00
典型的例子是函数,将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的超类,在这个参数中是Doctor。
同样,当需要返回一些Dalek的函数时,返回Enemy的函数是有效的,因为Dalek是-一个Enemy。
所以Doctor => Dalek是Doctor => Enemy的子类,因为Dalek是Enemy的子类,它是参数中的协变量。
发布于 2011-03-11 23:17:54
https://stackoverflow.com/questions/5277526
复制相似问题