Lab 05: Advanced Generics
Overview
Step 1: PECS — Producer Extends, Consumer Super
? extends T → you can READ from it (it PRODUCES T)
? super T → you can WRITE to it (it CONSUMES T)import java.util.*;
public class PECSDemo {
// PRODUCER: ? extends Number → reads numbers from the list
static double sum(List<? extends Number> producer) {
double total = 0;
for (Number n : producer) total += n.doubleValue();
return total;
}
// CONSUMER: ? super Integer → writes integers into the list
static void fill(List<? super Integer> consumer, int count) {
for (int i = 1; i <= count; i++) consumer.add(i);
}
// BOTH: transform producer → consumer
static <T extends Number> void copy(List<? extends T> src, List<? super T> dst) {
for (T item : src) dst.add(item);
}
public static void main(String[] args) {
// Producer: can read from List<Integer> or List<Double>
List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5);
List<Double> doubles = Arrays.asList(1.5, 2.5, 3.5);
System.out.println("Sum of ints: " + sum(ints)); // 15.0
System.out.println("Sum of doubles: " + sum(doubles)); // 7.5
// Consumer: can write to List<Number> or List<Object>
List<Number> nums = new ArrayList<>();
fill(nums, 3); // writes 1, 2, 3
System.out.println("Consumer added: " + nums);
// Copy: Integer producer → Number consumer
List<Number> dest = new ArrayList<>();
copy(ints, dest);
System.out.println("Copied: " + dest);
}
}Step 2: Type Erasure and Heap Pollution
Step 3: TypeToken Pattern — Capturing Generic Types at Runtime
Step 4: Recursive Generic Bounds
Step 5: Sealed Interfaces + Generics (Java 17+)
Step 6: Wildcard Capture Pattern
Step 7: Generic Methods and Type Inference
Step 8: Capstone — TypeToken + PECS Demo
Summary
Concept
Syntax
Key Rule
Last updated
