Rumah  >  Artikel  >  Java  >  Cara menggunakan kad bebas sempadan atas dan bawah untuk generik Java

Cara menggunakan kad bebas sempadan atas dan bawah untuk generik Java

王林
王林ke hadapan
2023-05-20 08:23:011518semak imbas

Sempadan atas

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

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 的超类

Kad bebas sempadan atas dan bawah

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam