Covariant, Contravariant, Contrabass, Codependent

I can never remember Scala‘s notation to indicate a covariant type vs. a contravariant type, so here it is:

Covariant [+A]

List can contain an object of type A or any subtype of A:

class List[+A]

Contravariant [-A]

Function1 accepts as an input an object of type T1 or any supertype of T1 (its return type R, however, is covariant):

trait Function1[-T1, +R]

Upper Type Bound [T <: A]

The following findSimilar function (borrowed from this example) accepts an instance of and a List of Similar objects or of objects that are subtypes of Similar:

def findSimilar[T <: Similar](e: T, xs: List[T]): Boolean

Lower Type Bound [T >: A]

Option#orElse accepts (and returns) an Option containing an object of type A or any supertype of A:

final def orElse[B >: A](alternative: ⇒ Option[B]): Option[B]