Generics
Type-safe reusable code: why generics exist, generic classes and methods, bounds, wildcards and PECS, and what type erasure really does.
Before Java 5, a List could hold anything, so every read needed a cast and every wrong element blew up at run time, often far from the line that caused it. Generics let you write List<String>: a list the compiler knows holds only strings. Mistakes become compile errors, casts disappear, and one class like ArrayList works safely for every element type.
This phase goes from the problem to the full toolset: generic classes and interfaces, generic methods and type inference, bounded type parameters like <T extends Comparable<T>>, wildcards (? extends, ? super) and the PECS rule that tells you which to use, and finally type erasure: what the compiler actually turns your generic code into, and the limits that follow from it (no new T(), no List<int>, no instanceof List<String>).
It builds on Phase 4 (classes, records) and Phase 5 (inheritance and interfaces). Every later phase depends on it: Phase 9's collections are generic types, and Phase 10's lambdas and streams are built on generic functional interfaces like Function<T, R>. Reading signatures such as <T> void sort(List<T> list, Comparator<? super T> c) stops being scary by the end of this phase.