Di Java, tidak mungkin merujuk secara langsung kepada jenis semasa dengan jenis pembolehubah. Isu timbul apabila cuba menulis kaedah yang boleh mengembalikan contoh jenis semasa, yang menjadi masalah apabila berurusan dengan subtaip. Sebagai contoh, mengisytiharkan kaedah generik dengan jenis pulangan T dalam kelas asas akan merujuk kepada jenis kelas asas dalam subkelas, bukan jenis subkelas sebenar.
Untuk menangani perkara ini, sempadan rekursif dan hierarki kelas abstrak boleh digunakan sebagai berikut:
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); } class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> { MyBaseClass() { } public SELF baseMethod() { return self(); } } final class MyLeafClass extends MyBaseClass<MyLeafClass> { @Override MyLeafClass self() { return this; } public MyLeafClass leafMethod() { return self(); } }
Dalam pendekatan ini, kelas daun menyelesaikan parameter jenis rekursif SELF kepada jenis mereka sendiri dan melaksanakan self(). Kelas daun boleh digunakan secara langsung, membenarkan kaedah rantaian sambil mengekalkan jenis pulangan yang betul:
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
Awas: Teknik ini bergantung pada corak templat berulang secara ingin tahu (CRT) dan memperkenalkan risiko tertentu :
Untuk mengurangkan risiko ini, pastikan kelas yang terlibat tidak boleh dilanjutkan secara terbuka dan pertimbangkan untuk menggunakan pakej-pribadi pembina dan kaedah untuk SelfTyped dan self().
Walaupun penyelesaian ini menyediakan cara untuk merujuk jenis semasa, ia memperkenalkan kerumitan dan pengehadan tambahan. Adalah dinasihatkan untuk menimbang dengan teliti faedah berbanding potensi kelemahan sebelum melaksanakannya. Dalam kes di mana rujukan jenis eksplisit adalah penting, penyelesaian ini boleh berguna, tetapi elakkan bergantung padanya secara berlebihan atau dalam API awam.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Merujuk Jenis Semasa dengan Pembolehubah Jenis di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!