+- Signs in Generic Declaration in Scala

“+” and “-” mean covariant and contravariant types respectively. In short, it means that:

PartialFunction[-A1, +B1] <: PartialFunction[-A2, +B2] only if A1 :> A2 and B1 <: B2, where <: is a subtyping relationship.

“-” usually applied for input parameters, “+” for output – in C# they even use respective keywords in and out. There is also some more primitive generic variance support in Java built up on existential types – actually you can do it using _ <: SomeType (covariance) or abstract type members type T <: SomeType in Scala as well.

Without modifiers PartialFunction[A1, B1] would have no direct relationship to a PartialFunction[A2, B2] (in other words, it would be invariant).

P.S. There are also some restrictions applied to such types, like covariant(“+”) type can’t be in contravariant position (you can only return it from a method) and vice-versa. This is done in order to support Liskov Substitution Principle and naturally understandable by “in”https://stackoverflow.com/”out” interpretation.

Also, it worth noting that A => B (syntax sugar for Function1) itself is using co-/contra-variance:

 trait Function1 [-T1, +R] extends AnyRef

As those functions can be extended through sub-typing which makes them theoretically partial as well (though it’s not how Scala treats these) – even technically “total” FunctionN in Scala could be extended, redefined, return null and so on.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)