Skip to content

Instantly share code, notes, and snippets.

@rubywai
Forked from tomaszpolanski/Variance.kt
Created December 29, 2020 13:41
Show Gist options
  • Save rubywai/d678a7ea2cb68120b3da3ee0844fa973 to your computer and use it in GitHub Desktop.
Save rubywai/d678a7ea2cb68120b3da3ee0844fa973 to your computer and use it in GitHub Desktop.
Covariance vs Contravariance
package com.tomek
abstract class Animal(val size: Int)
class Dog(val cuteness: Int): Animal(100)
class Spider(val terrorFactor: Int): Animal(1)
// Covariance
val dogList: List<Dog> = listOf()
val animalList: List<Animal> = dogList // Works!
val spiderList: List<Spider> = animalList // Compiler error, cannot assign List<Animal> to List<Spider>
// Contravariance
interface Compare<in T> {
fun compare(first: T, second: T): Int
}
val dogCompare: Compare<Dog> = object: Compare<Dog> {
override fun compare(first: Dog, second: Dog): Int {
return first.cuteness - second.cuteness
}
}
val animalCompare: Compare<Animal> = dogCompare // Compiler error, cannot assign List<Dog> to List<Animal>
val spider: Compare<Spider> = object: Compare<Animal> { // Works!
override fun compare(first: Animal, second: Animal): Int {
return first.size - second.size
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment