-
Book Overview & Buying
-
Table Of Contents
Programming Kotlin
By :
Type variance refers to the techniques by which we can allow, or not allow, subtyping in our parameterized types. If we consider a class Apple, which is a subtype of Fruit, then is a Crate<Apple> a subtype of a Crate<Fruit>? The first instinct is to think 'of course', since an Apple can be used where a Fruit is required, but generally speaking the answer is no.
In fact, a Crate<Apple> can be a subtype of Crate<Fruit>, a supertype of it, or neither depending on which type of variance is used.
Firstly, let's discuss why a Crate<Apple> might not be a subtype of Crate<Fruit> by default. Let's start by creating some classes:
class Fruit
class Apple : Fruit()
class Orange : Fruit()
class Crate<T>(val elements: MutableList<T>) {
fun add(t: T) = elements.add(t)
fun last(): T = elements.last()
}
As you can see, Crate is just a wrapper around a MutableList. If a function...