Start here. This is the direct spoken answer to practice first.
Overview
A useful generic contract says that types are related across positions; it is not merely a way to replace every concrete annotation with a letter.
Generics improve an API when the input and output types are related. A repository generic over T can return T, and a function that returns the first item of Iterable[T] preserves the caller's item type. A type variable represents one consistent type chosen for that use. A union instead means the value may be any listed alternative and does not automatically preserve which alternative went in.