0Pricing
Java Academy · Pelajaran

Wildcard Berbatas Bawah

? super T untuk konsumen.

Wildcard Berbatas Bawah adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Karakter Pengganti Berbatas Bawah

? super T adalah karakter pengganti berbatas bawah. Artinya, "suatu tipe tidak dikenal yang merupakan T atau supertipe T".

List<? super Integer> dapat merujuk ke List<Integer>, List<Number>, atau List<Object>.

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

public class Main {
    public static void main(String[] args) {
        List<? super Integer> a = new ArrayList<Number>();
        List<? super Integer> b = new ArrayList<Object>();
        a.add(1);
        b.add(2);
        System.out.println(a + " " + b);
    }
}

Menulis ke Konsumen

Dengan ? super Integer, Anda dapat dengan aman menambahkan Integer apa pun (atau subtipe Integer).

Apa pun tipe daftar sebenarnya, daftar itu setidaknya merupakan daftar dari suatu supertipe Integer, sehingga Integer selalu sesuai.

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

public class Main {
    static void addNumbers(List<? super Integer> dest) {
        for (int i = 1; i <= 3; i++) dest.add(i);
    }
    public static void main(String[] args) {
        List<Number> nums = new ArrayList<>();
        addNumbers(nums);
        System.out.println(nums);
    }
}

Membaca Menghasilkan Object

Imbalannya: ketika Anda membaca dari daftar ? super T, kompilator hanya mengetahui bahwa elemennya merupakan suatu supertipe T yang tidak diketahui.

Satu-satunya tipe yang aman untuk pembacaan adalah Object.

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

public class Main {
    public static void main(String[] args) {
        List<? super Integer> list = new ArrayList<Number>();
        list.add(10);
        Object o = list.get(0); // only Object is guaranteed
        // Integer i = list.get(0); // would NOT compile
        System.out.println(o);
    }
}

Mengapa Pembacaan Terbatas

List<? super Integer> mungkin sebenarnya merupakan List<Object> yang berisi String.

Jadi, pembacaan dapat mengembalikan Object apa pun. Kompilator tidak dapat menjamin bahwa hasilnya adalah Integer; karena itu, pembacaan hanya menghasilkan Object.

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

public class Main {
    public static void main(String[] args) {
        List<Object> raw = new ArrayList<>();
        raw.add("a string");
        List<? super Integer> view = raw; // legal: Object is a supertype of Integer
        view.add(5);
        System.out.println(view.get(0).getClass().getSimpleName());
    }
}

Kasus Penggunaan Konsumen

Gunakan ? super T ketika suatu metode hanya mengonsumsi (menulis ke dalam) nilai.

Metode yang mengisi koleksi tujuan adalah kasus klasiknya.

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

public class Main {
    static void fill(List<? super String> dest, int count) {
        for (int i = 0; i < count; i++) dest.add("item" + i);
    }
    public static void main(String[] args) {
        List<Object> objs = new ArrayList<>();
        fill(objs, 3);
        System.out.println(objs);
    }
}

Menambahkan Subtipe Juga Berhasil

Dengan ? super Number, Anda dapat menambahkan Number apa pun atau subtipenya: bilangan bulat, bilangan pecahan, dan bilangan panjang.

Batas bawah menjamin bahwa daftar tersebut menerima setidaknya Number, sehingga semua subtipenya sesuai.

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

public class Main {
    public static void main(String[] args) {
        List<? super Number> list = new ArrayList<Object>();
        list.add(1);      // Integer
        list.add(2.5);    // Double
        list.add(3L);     // Long
        System.out.println(list);
    }
}

Gaya Collections.addAll

JDK menggunakan batas bawah untuk penampung. Misalnya, metode generik yang mendorong elemen ke dalam tujuan.

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

public class Main {
    @SafeVarargs
    static <T> void addAll(List<? super T> dest, T... items) {
        for (T item : items) dest.add(item);
    }
    public static void main(String[] args) {
        List<Object> sink = new ArrayList<>();
        addAll(sink, "a", "b", "c");
        System.out.println(sink);
    }
}

Pembanding dengan super

Contoh penggunaan di dunia nyata: Comparator<? super T> memungkinkan pengurutan menerima pembanding yang ditulis untuk suatu supertipe.

Pembanding yang membandingkan Object apa pun berdasarkan toString dapat mengurutkan daftar String.

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

public class Main {
    public static void main(String[] args) {
        Comparator<Object> byString = Comparator.comparing(Object::toString);
        List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
        names.sort(byString); // List<String>.sort accepts Comparator<? super String>
        System.out.println(names);
    }
}

super dan extends Adalah Kebalikan

Kedua karakter pengganti ini saling berlawanan:

  • ? extends T: membaca T, tidak dapat menulis. Sebuah produsen.
  • ? super T: menulis T, hanya dapat membaca Object. Sebuah konsumen.

Simetri inilah inti aturan PECS yang akan Anda pelajari berikutnya.

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

public class Main {
    public static void main(String[] args) {
        List<? super Integer> consumer = new ArrayList<Number>();
        consumer.add(1);
        System.out.println("consumer can write: " + consumer);
    }
}

Menyalin di Antara Batas

Metode copy menunjukkan kedua karakter pengganti sekaligus: membaca dari ? extends T, menulis ke ? super T.

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

public class Main {
    static <T> void copy(List<? extends T> src, List<? super T> dest) {
        for (T t : src) dest.add(t);
    }
    public static void main(String[] args) {
        List<Integer> src = List.of(1, 2, 3);
        List<Number> dest = new ArrayList<>();
        copy(src, dest);
        System.out.println(dest);
    }
}

Kapan Tidak Menggunakan Karakter Pengganti

Jika suatu metode membaca dan menulis T, jangan gunakan karakter pengganti. Gunakan tipe yang tepat atau parameter tipe yang diberi nama.

Karakter pengganti memang ditujukan khusus untuk kasus hanya-baca atau hanya-tulis.

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

public class Main {
    static <T> void swapFirstTwo(List<T> list) {
        T tmp = list.get(0);
        list.set(0, list.get(1));
        list.set(1, tmp);
    }
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(List.of("a", "b"));
        swapFirstTwo(list);
        System.out.println(list);
    }
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang batas bawah.

Ringkasan

Anda telah mempelajari karakter pengganti berbatas bawah:

  • ? super T berarti supertipe T yang tidak diketahui.
  • Anda dapat menulis T dan subtipenya (sebuah konsumen).
  • Pembacaan hanya mengembalikan Object.
  • Karakter ini merupakan kebalikan tepat dari ? extends T.

Selanjutnya, aturan yang menghubungkan keduanya: PECS.

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

public class Main {
    public static void main(String[] args) {
        List<? super Integer> list = new ArrayList<Number>();
        list.add(42);
        System.out.println("Lower bound recap: " + list);
    }
}

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Wildcard Berbatas Bawah” gratis?

Ya — teks lengkap “Wildcard Berbatas Bawah” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Wildcard Berbatas Bawah”?

? super T untuk konsumen. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Wildcard Berbatas Bawah” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Wildcard Berbatas Atas
  2. Wildcard Berbatas Bawah
  3. Prinsip PECS
  4. Wildcard dalam API
← Kembali ke Java Academy