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]