Generics and Wildcards

Generics provide compile-time type safety without repeated casts.

List<String> names = new ArrayList<>();
names.add("Java");

static double sum(List<? extends Number> values) {
    double total = 0;
    for (Number value : values) {
        total += value.doubleValue();
    }
    return total;
}

? extends T is useful when a structure is primarily a producer of T. ? super T is useful when it consumes T. This is commonly remembered as PECS: Producer Extends, Consumer Super.

Generic type information is largely erased at runtime.

PECS

Use extends when you mainly read values as a base type; use super when you mainly write values of a subtype.

Key Takeaways
  • Generics catch many type errors at compile time.
  • ? extends T is producer-oriented; ? super T is consumer-oriented.
  • Java generics use type erasure rather than fully reified generic types.