O'Reilly logo

Programming Kotlin by Stefan Bocutiu, Stephen Samuel

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required