Core Java
18 — Generics
Previous: 17 Collections · Next: 19 Lambdas & Functional
▶️ java pkg1core/core20GenericsDemo.java
Why generics?
1List<String> names = new ArrayList<>();2names.add("Ravi");3// names.add(42); // COMPILE ERROR — type safe!4String s = names.get(0); // no cast neededCompile-time safety; removes casts; enables better APIs.
Generic class
1class Pair<A, B> {2 final A first;3 final B second;4 Pair(A a, B b) { first = a; second = b; }5}Generic method
1static <T extends Comparable<T>> T max(List<T> items) {2 T best = items.get(0);3 for (T x : items) if (x.compareTo(best) > 0) best = x;4 return best;5}<T extends Comparable<T>> is a bounded type parameter.
Wildcards & PECS
| Wildcard | Read as | Use when |
|---|---|---|
? extends T |
Producer | Read T values out |
? super T |
Consumer | Write T values in |
1double sum(List<? extends Number> nums) { ... } // read numbers2void addInts(List<? super Integer> sink) { ... } // write integersPECS: Producer Extends, Consumer Super.
Type erasure
At runtime, List<String> becomes raw List — generic type info is erased.
⚠️ Can't do new T[], can't instanceof List<String>, can't overload on generics only.
Interview drill → 08 Generics
Next → 19 Lambdas & Functional
Source named in this chapter
- core20GenericsDemopkg1core/core20GenericsDemo.java