Lewati ke isi

๐Ÿงฌ Generics dalam Java

Generics memungkinkan kita menulis kode yang bisa bekerja dengan berbagai tipe data tanpa mengorbankan type safety.

Tanpa generics: - Banyak cast - Rentan runtime error - Tidak fleksibel

Dengan generics: - Lebih aman (cek tipe di compile-time) - Lebih fleksibel (reusable untuk banyak tipe) - Lebih bersih


๐Ÿ”ฐ Motivasi: Sebelum & Sesudah Generics

Sebelum:

ArrayList list = new ArrayList();
list.add("Marno");
String nama = (String) list.get(0); // perlu cast
````

**Sesudah:**

```java
ArrayList<String> list = new ArrayList<>();
list.add("Marno");
String nama = list.get(0); // tanpa cast, aman


๐Ÿ”ง Generic Class

public class Kotak<T> {
    private T isi;

    public void setIsi(T isi) {
        this.isi = isi;
    }

    public T getIsi() {
        return isi;
    }
}

Penggunaan:

Kotak<String> k1 = new Kotak<>();
k1.setIsi("Sawit");

Kotak<Integer> k2 = new Kotak<>();
k2.setIsi(100);

๐Ÿงช Generic Method

public class Util {
    public static <T> void tampilkan(T data) {
        System.out.println(data);
    }
}

Pemanggilan:

Util.tampilkan("Selamat datang");
Util.tampilkan(123);

โš™๏ธ Multiple Type Parameters

public class Pasangan<K, V> {
    private K kunci;
    private V nilai;

    public Pasangan(K k, V v) {
        this.kunci = k;
        this.nilai = v;
    }

    public K getKunci() { return kunci; }
    public V getNilai() { return nilai; }
}

Penggunaan:

Pasangan<String, Integer> p = new Pasangan<>("Ali", 50);
System.out.println(p.getKunci() + " => " + p.getNilai());

๐Ÿ“ฅ Bounded Type Parameter (extends)

public class Pengolah<T extends Number> {
    public double duaKali(T nilai) {
        return nilai.doubleValue() * 2;
    }
}

Pemanggilan:

Pengolah<Integer> p = new Pengolah<>();
System.out.println(p.duaKali(5)); // Output: 10.0

๐Ÿ“š Wildcard ?

Syntax Arti
<?> Tipe bebas
<? extends T> Turunan dari T (bisa T atau subclass)
<? super T> T atau superclass-nya

Contoh:

public void cetakSemua(List<?> daftar) {
    for (Object o : daftar) {
        System.out.println(o);
    }
}

๐Ÿง  Studi Kasus: Stack Generik

public class Stack<T> {
    private ArrayList<T> data = new ArrayList<>();

    public void push(T item) {
        data.add(item);
    }

    public T pop() {
        if (!data.isEmpty()) {
            return data.remove(data.size() - 1);
        }
        return null;
    }

    public boolean isEmpty() {
        return data.isEmpty();
    }
}

๐Ÿ“Œ Kesimpulan

Konsep Penjelasan
<T> Parameter generik
Kotak<T> Class generik
<T extends A> Membatasi tipe hanya ke subclass dari A
<?> Wildcard: tipe bebas
Keuntungan Reusable, type-safe, lebih bersih dan modern

โžก๏ธ Selanjutnya: Lambda Expression (Fungsi Ringkas)