在 的情况下,在实际影响类本身而不是类型参数之前class SomeThing[T]
放置一个+
或。-
T
考虑以下:
val instanceA = new SomeThing[A]
val instanceB = new SomeThing[B]
如果在(no或)SomeThing
上是不变的,则实例将没有方差关系。T
+
-
如果在( )SomeThing
上是协变的,那么实例将具有与和相同的方差关系。换句话说,如果是的子类型(反之亦然),那么实例将反映相同的关系。T
[+T]
A
B
A
B
如果在( )SomeThing
上是逆变的,则实例将具有与和具有相反的方差关系。换句话说, if是 的子类型then将是 的子类型。T
[-T]
A
B
A
B
instanceB
instanceA
但是方差指示符确实会影响类型参数的使用方式。如果T
被标记+
,那么它不能被放置在逆变位置,同样,如果被标记,-
那么它不能被放置在协变位置。我们在定义方法时经常遇到这种情况。
Scala 方法与 Scala 函数特征密切相关:Function0
、Function1
、Function2
等。
考虑 的定义Function1
:
trait Function1[-T1, +R] extends AnyRef
现在假设您要传递这种类型的函数。
def useThisFunc(f: A => B):Unit = {...}
因为 aFunction1
在其接收参数上是逆变的并且在其结果上是协变的,所以以下所有内容都可以作为useThisFunc()
参数接受。
val a2b : A => B = ???
val supa2b : SuperOfA => B = ???
val a2subb : A => SubOfB = ???
val supa2subb : SuperOfA => SubOfB = ???
因此,总而言之,如果SomeThing
是协变的,T
那么您不能将其T
作为成员方法的传递参数,因为FunctionX
它的参数类型是逆变的。同样, ifSomeThing
是逆变T
的,您不能将其T
作为成员方法返回类型,因为FunctionX
它的返回类型是协变的。