Написать метод класса Box - map, который принимает функцию и возвращает новый Box с результатом применения
этой функции к хранящемуся в старом Box значению
???
case class Box[A](value: A) {
def map[B](f: A => B): Box[B] =
Box(f(value))
}
scala> val box = Box(Cat("Kuzya"))
box: Box[Cat] = Box(Cat(Kuzya))
scala> getName(box)
<console>:19: error: type mismatch;
found : Box[Cat]
required: Box[Animal]
Note: Cat <: Animal, but class Box is invariant in type T.
Invariance
A =:= B => F[A] =:= F[B]
case class Box[T](value: T)
Box[Animal] =:= Box[Animal]
Box[Cat] =:= Box[Cat]
Box[Cat] <: Box[Animal] - неверно!
Covariance
A <: B => F[A] <: F[B]
case class Box[+T](value: T)
Cat <: Animal => Box[Cat] <: Box[Animal]
scala> getName(box)
res2: String = Kuzya
Почему всегда не использовать ковариантность?
Contravariance
B <: A => F[A] <: F[B]
trait Printer[-T] {
def print(value: T): String
}
val catPrinter = new Printer[Cat] {
override def print(cat: Cat): String =
cat.name + " is a cat!"
}
val animalPrinter = new Printer[Animal] {
override def print(animal: Animal): String =
animal match {
case Cat(name) => name + " is a cat!"
case Dog(name) => name + " is a dog!"
}
}