Apabila bekerja dengan generik di Java, anda mungkin menghadapi keperluan untuk mengehadkan jenis kelas generik untuk melanjutkan sesuatu yang khusus kelas dan melaksanakan antara muka tertentu. Walaupun nampaknya munasabah untuk menjangkakan bahawa percubaan berikut akan berjaya:
Class<? extends ClassA>
Class<? extends InterfaceB>
Malangnya, hanya satu daripada ini boleh digunakan pada satu masa. Jadi, bagaimanakah kita boleh menggabungkan dua sekatan?
Malah, adalah mungkin untuk menentukan berbilang antara muka atau kelas dan antara muka dalam parameter jenis generik menggunakan "&":
<T extends ClassA & InterfaceB>
Ini membolehkan kami mentakrifkan jenis generik yang terhad kepada kedua-dua melanjutkan kelas yang ditentukan dan melaksanakan antara muka yang ditentukan.
Sebagai contoh, jika kita mentakrifkan kelas ClassB dan antara muka AntaramukaC, kita boleh mencipta kelas generik seperti berikut:
class MyClass<T extends ClassB & InterfaceC> { Class<T> variable; }
Ini memastikan bahawa medan pembolehubah bagi MyClass hanya boleh menyimpan rujukan kepada kelas yang memanjangkan ClassB dan melaksanakan InterfaceC.
Walaupun ciri ini memberikan fleksibiliti untuk menentukan jenis generik, ia juga boleh membawa kepada pengisytiharan yang kompleks, seperti yang dilihat dalam pengisytiharan JavaDoc Collections#max:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Kerumitan ini timbul disebabkan oleh pertimbangan untuk keserasian binari. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kerumitan ini terutamanya ditemui semasa mentakrifkan kelas atau kaedah generik, dan bukan semasa mengisytiharkan pembolehubah generik.
Oleh itu, untuk mencapai matlamat anda mencipta objek kelas yang memanjangkan kelas tertentu dan melaksanakan antara muka tertentu, anda boleh menggunakan pendekatan berikut:
class classB { } interface interfaceC { } public class MyClass<T extends classB & interfaceC> { T variable; }
Ini akan memberikan anda sekatan yang diingini untuk medan pembolehubah Kelas Saya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengehadkan Kelas Generik Java untuk Memanjangkan Kelas dan Melaksanakan Antara Muka Secara serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!