Sempadan atas generik menentukan bahawa parameter jenis mestilah subkelas kelas tertentu atau melaksanakan antara muka tertentu. Sintaksnya ialah T extends B
, dengan T ialah parameter jenis generik dan B ialah jenis sempadan atas. Sebagai contoh, kod berikut menunjukkan kelas generik Box
yang parameter jenis T mestilah Number
atau subkelasnya:
public class Box<T extends Number> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } }
Dalam kod di atas, kami telah menggunakan kata kunci extends
untuk menentukan jenis sempadan atas parameter jenis generik, yang bermaksud bahawa parameter jenis generik mestilah Number
atau subkelasnya. Dengan cara ini, kita boleh menggunakan kelas Box
untuk menyimpan nilai jenis Integer
, Double
, Float
, dsb., kerana kesemuanya ialah subkelas Number
. Selain itu, dengan menggunakan sempadan atas generik, kami boleh memastikan bahawa hanya nilai jenis Box
disimpan dalam keadaan kelas Number
, mengelakkan risiko pengecualian penukaran jenis.
Apabila menggunakan generik, jika kita memasukkan parameter yang jenisnya tidak memenuhi had sempadan atas, ralat akan berlaku semasa penyusunan, contohnya:
Box<String> box = new Box<>("Hello World"); // 编译错误:String 不是 Number 的子类
Sempadan bawah generik menentukan bahawa parameter jenis mestilah kelas super bagi kelas tertentu atau kelas pelaksanaan antara muka. Sintaksnya ialah T super B
, dengan T ialah parameter jenis generik dan B ialah jenis sempadan bawah. Berikut ialah contoh yang menunjukkan kelas generik Box
dengan parameter jenis T mestilah Object
atau kelas supernya:
public class Box<T super Object> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } }
Dalam kod di atas, kami telah menggunakan kata kunci super
untuk menentukan sempadan bawah jenis parameter jenis generik, yang bermaksud parameter jenis generik mestilah Object
atau superclassnya. Dengan cara ini, kita boleh menggunakan kelas Box
untuk menyimpan nilai jenis Object
, String
, Integer
, Double
, dsb., kerana kesemuanya ialah subkelas Object
. Selain itu, dengan menggunakan sempadan bawah generik, kami boleh memastikan bahawa nilai yang disimpan dalam keadaan kelas Box
adalah semua jenis Object
, mengelakkan risiko pengecualian penukaran jenis.
Apabila menggunakan generik, jika kita memasukkan parameter yang jenisnya tidak memenuhi had sempadan bawah, ralat akan berlaku semasa penyusunan, contohnya:
Box<Integer> box = new Box<>(123); // 编译错误:Integer 不是 Object 的超类
Kadangkala, kita perlu menggunakan kedua-dua sempadan atas dan bawah dalam generik Dalam kes ini, kita boleh menggunakan kad bebas ?
untuk mewakili jenis yang tidak diketahui. Sebagai contoh, kod berikut menunjukkan kaedah generik copy
yang menyalin elemen satu tatasusunan kepada tatasusunan lain:
public static <T> void copy(List<? extends T> src, List<? super T> dest) { for (T t : src) { dest.add(t); } }
Dalam kod di atas, kami telah menggunakan aksara kad bebas ?
untuk Mewakili jenis yang tidak diketahui , yang pada masa yang sama boleh memenuhi kekangan bahawa parameter src
ialah jenis T
atau subkelasnya dan parameter dest
ialah jenis T
atau kelas supernya. Dengan cara ini, kita boleh menyalin elemen apa-apa jenis ke dalam senarai lain. Dengan menggunakan kad bebas sempadan atas dan bawah, kami boleh menentukan kaedah generik dengan lebih fleksibel sambil memastikan keselamatan jenis.
Atas ialah kandungan terperinci Cara menggunakan kad bebas sempadan atas dan bawah untuk generik Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!