最近我注意到方差注释可以用在类型别名中.以下示例来自Predef
:
type Function[-A, +B] = Function1[A, B]
Run Code Online (Sandbox Code Playgroud)
我开始思考,它可以在哪里使用.显然,您不能将方差更改为相反,或使不变类型表现为共变或逆变.编译器会抛出一个错误,就像这样
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
Run Code Online (Sandbox Code Playgroud)
但是,你可以使一些变体类型的行为像不变量(至少,编译器不会与此争论).所以,我试着制作一个不变的版本List
scala> type InvList[T] = List[T]
defined type alias InvList
Run Code Online (Sandbox Code Playgroud)
但是这个新的不变量List
仍然表现得像它的原始协变版本:
scala> val l: InvList[String] = List("foo")
l: InvList[String] = List(foo)
scala> val anyList: InvList[Any] = l
anyList: InvList[Any] = List(foo)
Run Code Online (Sandbox Code Playgroud)
那么,我错过了什么?类型别名中的方差注释的目的是什么?您能举例说明带有方差注释的类型别名,它与原始类型不同.