import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) {
        List<Integer> intList = List.of(1, 2, 3);
        List<Double> dblList = List.of(1.5, 2.5, 3.5);

        // Producer: can accept List<Integer> or List<Double>
        double sum1 = sumNumbers(intList);
        double sum2 = sumNumbers(dblList);
        System.out.println("Sum of integers: " + sum1);
        System.out.println("Sum of doubles:  " + sum2);

        
        // Consumer: can accept List<Object> or List<Integer>
        intList = new ArrayList<>(intList);
        List<Object> objList = new ArrayList<>();
        addIntegers(intList);
        addIntegers(objList);

        System.out.println("objList after adding Integers: " + objList);
        System.out.println("intList after adding Integers: " + intList);
    }

    // PRODUCER: can read Numbers (and subtypes), cannot add new elements.
    public static double sumNumbers(List<? extends Number> list) {
        double sum = 0.0;
        for (Number n : list) {
            sum += n.doubleValue();
        }
        return sum;
    }

    // CONSUMER: can add Integers (or subtypes), but reading gives only Object
    public static void addIntegers(List<? super Integer> list) {
        list.add(10);
        list.add(20);
        Object obj = list.get(0);
    }
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: