Chapter 10. generics: Know Your Ins from Your Outs

image

Everybody likes code that’s consistent.

And one way of writing consistent code that’s less prone to problems is to use generics . In this chapter, we’ll look at how Kotlin’s collection classes use generics to stop you from putting a Cabbage into a List<Seagull>. You’ll discover when and how to write your own generic classes, interfaces and functions , and how to restrict a generic type to a specific supertype. Finally, you’ll find out how to use covariance and contravariance,  putting YOU in control of your generic type’s behavior.

Collections use generics

As you learned in the previous chapter, each time you explicitly declare a collection’s type, you must specify both the kind of collection you want to use, and the type of element it contains. The following code, for example, defines a variable that can hold a reference to a MutableList of Strings:

val x: MutableList< String>

The element type is defined inside angle brackets <>, which means that it uses generics. Generics lets you write code that’s type-safe. It’s what makes the compiler stop you from putting a Volkswagen into a list of Ducks. The compiler knows that you can only put Duck objects into a MutableList<Duck>, which means that more problems are caught at compile-time.

WITHOUT generics, objects would go IN as a reference to Duck, Fish, Guitar and Car objects... ...

Get Head First 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.