-
Book Overview & Buying
-
Table Of Contents
-
Feedback & Rating
Professional Scala
By :
Variance provides a way to constrain parameterized types. It defines a subtyping relationship between parameterized types based on the subtyping relationship of their component types.
Imagine that you have the following class hierarchy:
class Tool
class HandTool extends Tool
class PowerTool extends Tool
class Hammer extends HandTool
class Screwdriver extends HandTool
class Driller extends PowerTool
If we define a generic box:
trait Box[T] {
def get: T
}How can
Box of
Tools relate to one another? Scala provides three ways:
Covariant:
Box[Hammer] <: Box[Tool] if Hammer <: Tool
Contravariant:
Box[Tool] <: Box[Hammer] if Tool <: Hammer
Invariant: There's no subtyping relationship between
Box[Tool] and
Box[Hammer] independently of the subtyping relationship of
Tool and
Hammer
Let's assume
that we want to define a function called
isSuitable, which
takes a
Box[HandTool] and tests if the box is suitable to accommodate
the tool it attempts to box:
def...
Change the font size
Change margin width
Change background colour