Kad Liar Berhad Bawah
? super T untuk pengguna
Kad Liar Berhad Bawah ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Kad Bebas Bersempadan Bawah
? super T ialah kad bebas bersempadan bawah. Maksudnya ialah "sesuatu jenis tidak diketahui yang merupakan T atau jenis induk T".
List<? super Integer> boleh merujuk kepada 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 kepada Pengguna
Dengan ? super Integer, anda boleh menambah mana-mana integer (atau subjenis integer) dengan selamat.
Walau apa pun jenis senarai sebenar, senarai itu sekurang-kurangnya ialah senarai bagi suatu jenis induk integer, jadi integer sentiasa sesuai dimasukkan.
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 Objek
Timbal balasnya: apabila anda membaca daripada senarai ? super T, pengkompil hanya mengetahui bahawa elemen itu ialah suatu jenis induk T yang tidak diketahui.
Satu-satunya jenis yang selamat untuk pembacaan ialah 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);
}
}Sebab Pembacaan Terhad
List<? super Integer> sebenarnya mungkin merupakan List<Object> yang menyimpan nilai String.
Jadi, pembacaan boleh mengembalikan apa-apa objek. Pengkompil tidak boleh menjamin bahawa nilainya ialah integer, maka pembacaan hanya memberikan objek.
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());
}
}Kes Penggunaan Pengguna
Gunakan ? super T apabila kaedah hanya menggunakan (menulis masuk) nilai.
Kaedah yang mengisi koleksi destinasi ialah kes klasik.
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);
}
}Menambah Subjenis Juga Berfungsi
Dengan ? super Number, anda boleh menambah mana-mana nombor atau subjenisnya: integer, nilai perpuluhan dan integer panjang.
Sempadan bawah menjamin bahawa senarai itu menerima sekurang-kurangnya nombor, jadi semua subjenisnya sesuai dimasukkan.
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 sempadan bawah untuk saluran penerima. Contohnya, kaedah generik yang menolak elemen ke dalam destinasi.
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 Sempadan Bawah
Contoh penggunaan dunia sebenar: Comparator<? super T> membolehkan operasi pengisihan menerima pembanding yang ditulis untuk jenis induk.
Pembanding yang membandingkan apa-apa objek menggunakan toString boleh mengisih senarai 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 ialah Cerminan
Kedua-dua kad bebas ini berlawanan:
? extends T: baca T, tidak boleh menulis. Sebuah pengeluar.? super T: tulis T, hanya baca Objek. Sebuah pengguna.
Kesimetrian ini ialah inti pati peraturan PECS yang akan anda pelajari seterusnya.
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 antara Sempadan
Kaedah salinan menunjukkan kedua-dua kad bebas serentak: membaca daripada ? extends T dan menulis kepada ? 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);
}
}Bila Tidak Menggunakan Kad Bebas
Jika kaedah membaca dan menulis T, jangan gunakan kad bebas. Gunakan jenis tepat atau parameter jenis yang dinamakan.
Kad bebas wujud khusus untuk kes baca sahaja atau tulis sahaja.
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);
}
}Semakan Pantas
Uji pemahaman anda tentang sempadan bawah.
Rumusan
Anda telah mempelajari kad bebas bersempadan bawah:
? super Tbermaksud jenis induk T yang tidak diketahui.- Anda boleh menulis T dan subjenisnya (sebuah pengguna).
- Pembacaan hanya mengembalikan Object.
- Ia merupakan cerminan tepat bagi
? extends T.
Seterusnya, peraturan yang menghubungkan kedua-duanya: 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);
}
}Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Kad Liar Berhad Bawah” percuma?
Ya — teks penuh “Kad Liar Berhad Bawah” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Kad Liar Berhad Bawah”?
? super T untuk pengguna Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Kad Liar Berhad Bawah” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Kad Liar Berhad Atas
- Kad Liar Berhad Bawah
- Prinsip PECS
- Kad Liar dalam API