import java.util.ArrayList;
import java.util.List;

public class DemoGenerics {
    static final class Pila<T> {
        private static final class Nodo<T> {
            final T valore;
            final Nodo<T> precedente;

            Nodo(T valore, Nodo<T> precedente) {
                this.valore = valore;
                this.precedente = precedente;
            }
        }

        private Nodo<T> cima;

        void inserisci(T valore) {
            cima = new Nodo<>(valore, cima);
        }

        T estrai() {
            if (cima == null) {
                throw new IllegalStateException("pila vuota");
            }
            T valore = cima.valore;
            cima = cima.precedente;
            return valore;
        }
    }

    static void copiaNumeri(List<? extends Number> origine, List<? super Number> destinazione) {
        for (Number numero : origine) {
            destinazione.add(numero);
        }
    }

    public static void main(String[] args) {
        Pila<String> titoli = new Pila<>();
        titoli.inserisci("Java");
        String titolo = titoli.estrai();
        System.out.println(titolo.toUpperCase());

        List<Integer> interi = List.of(2, 3);
        List<Number> numeri = new ArrayList<>();
        copiaNumeri(interi, numeri);
        System.out.println(numeri);
    }
}
