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

public class AlatDaftar {
    // T disimpulkan dari tipe argument saat pemanggilan
    static <T> T pertama(List<T> daftar) {
        return daftar.get(0);
    }

    // T dipakai pada parameter varargs sekaligus tipe kembalian
    @SafeVarargs
    static <T> List<T> dari(T... nilai) {
        List<T> hasil = new ArrayList<>();
        for (T t : nilai) {
            hasil.add(t);
        }
        return hasil;
    }

    // T hanya muncul di parameter — method tanpa nilai balik
    static <T> void tukar(List<T> daftar, int i, int j) {
        T sementara = daftar.get(i);
        daftar.set(i, daftar.get(j));
        daftar.set(j, sementara);
    }

    public static void main(String[] args) {
        List<String> nama = List.of("Budi", "Siti", "Dewi");
        String depan = pertama(nama);           // T disimpulkan String
        System.out.println("Pertama : " + depan);

        List<Integer> angka = List.of(10, 20, 30);
        Integer awal = pertama(angka);          // T disimpulkan Integer
        System.out.println("Awal    : " + awal);

        Integer eksplisit = AlatDaftar.<Integer>pertama(angka);
        System.out.println("Witness : " + eksplisit);

        List<String> bulan = dari("Jan", "Feb", "Mar");
        System.out.println("Bulan   : " + bulan);

        List<String> kota = new ArrayList<>(List.of("Jakarta", "Bandung"));
        tukar(kota, 0, 1);
        System.out.println("Tukar   : " + kota);
    }
}
