Type variance

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.

Invariance

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>) { ...

Get Programming Kotlin now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.