最近我注意到可以在类型别名中使用方差注释。以下是来自的示例Predef
:
type Function[-A, +B] = Function1[A, B]
我开始思考,它可以用在哪里。显然,您不能将方差更改为相反,或者使不变类型表现为协变或逆变。编译器会抛出一个错误,像这样
scala> type BrokenFunc[+T, -R] = Function1[T, R]
<console>:7: error: covariant type T occurs in contravariant position in type
[+T, -R]T => R of type BrokenFunc
但是,您可以使某些变体类型表现得像不变的(至少,编译器不会对此提出异议)。所以,我试图制作一个不变的版本List
scala> type InvList[T] = List[T]
defined type alias InvList
但是这个新的不变量List
仍然表现得和它原来的协变版本一样:
scala> val l: InvList[String] = List("foo")
l: InvList[String] = List(foo)
scala> val anyList: InvList[Any] = l
anyList: InvList[Any] = List(foo)
那么,我错过了什么?类型别名中差异注释的目的是什么?您能否举一个带有差异注释的类型别名示例,它与原始类型不同。