Bolehkah Pembolehubah Taip Merujuk Jenis Semasa?
Andaikan anda ingin mencipta fungsi yang mengembalikan tika jenis semasa. Adakah terdapat cara untuk memastikan T merujuk secara khusus kepada subjenis (cth., T harus merujuk kepada B dalam kelas B)?
Melaksanakan Penyelesaian
Memperluaskan respons StriplingWarrior , corak berikut adalah penting untuk mencapai ini (resipi untuk pembangun fasih berhierarki API):
PENYELESAIAN
Tentukan Kelas atau Antara Muka Abstrak Asas:
Tubuhkan kontrak untuk mendapatkan jenis masa jalan bagi contoh yang melanjutkan kelas:
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); }
Buat Kelas Abstrak Pertengahan:
Kelas perantaraan mengekalkan parameter jenis rekursif SELF. Mereka hendaklah abstrak untuk mengelakkan penggunaan langsung:
public abstract class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> {...}
Tentukan Kelas Daun:
Kelas akhir menyelesaikan parameter jenis SELF dengan mereka jenis sendiri. Jadikan mereka muktamad untuk keselamatan:
public final class MyLeafClass extends MyBaseClass<MyLeafClass> {...}
Contoh Penggunaan:
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
Awas dan Kesimpulan
Corak ini ialah pelaksanaan "templat berulang secara ingin tahu" dalam Java. Walaupun berkuasa, ia memerlukan penggunaan yang teliti dan paling baik dikhaskan untuk API dalaman sahaja. Corak itu sememangnya tidak selamat dan mesti digunakan dengan berhati-hati untuk mengelakkan penyalahgunaan. Walau bagaimanapun, apabila digunakan dengan berkesan, ia boleh meningkatkan ekspresif dan kebolehgunaan API pembina.
Atas ialah kandungan terperinci Bolehkah Pembolehubah Jenis Merujuk Kelas Penentuannya di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!