Core Java

18 — Generics

Previous: 17 Collections · Next: 19 Lambdas & Functional

▶️ java pkg1core/core20GenericsDemo.java


Why generics?

java
1List<String> names = new ArrayList<>();2names.add("Ravi");3// names.add(42);   // COMPILE ERROR — type safe!4String s = names.get(0);   // no cast needed

Compile-time safety; removes casts; enables better APIs.


Generic class

java
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

java
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
java
1double sum(List<? extends Number> nums) { ... }    // read numbers2void addInts(List<? super Integer> sink) { ... }   // write integers

PECS: 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