Saya pikir semua jawaban sebelumnya telah kehilangan pandangan tentang hutan untuk pepohonan.
Java generics tidak sama dengan templat ; mereka menggunakan tipe erasure , yang merupakan teknik dinamis , daripada mengkompilasi polimorfisme waktu , yang merupakan teknik statis . Seharusnya jelas mengapa kedua taktik yang sangat berbeda ini tidak berhasil dengan baik.
Daripada mencoba menggunakan konstruksi waktu kompilasi untuk mensimulasikan proses waktu berjalan, mari kita lihat apa yang extends
sebenarnya dilakukan: menurut Stack Overflow dan Wikipedia , extends digunakan untuk mengindikasikan subklasifikasi.
C ++ juga mendukung subclassing.
Anda juga menunjukkan kelas kontainer, yang menggunakan penghapusan tipe dalam bentuk generik, dan diperluas untuk melakukan pemeriksaan tipe. Di C ++, Anda harus melakukan sendiri mesin tipe erasure, yang sederhana: buat pointer ke superclass.
Mari kita bungkus menjadi typedef, untuk membuatnya lebih mudah digunakan, daripada membuat seluruh kelas, dan voila:
typedef std::list<superclass*> subclasses_of_superclass_only_list;
Sebagai contoh:
class Shape { };
class Triangle : public Shape { };
typedef std::list<Shape*> only_shapes_list;
only_shapes_list shapes;
shapes.push_back(new Triangle()); // Works, triangle is kind of shape
shapes.push_back(new int(30)); // Error, int's are not shapes
Sekarang, tampaknya List adalah sebuah antarmuka, mewakili semacam koleksi. Antarmuka dalam C ++ hanya akan menjadi kelas abstrak, yaitu, kelas yang mengimplementasikan apa pun kecuali metode virtual murni. Dengan menggunakan metode ini, Anda dapat dengan mudah mengimplementasikan contoh java Anda di C ++, tanpa Konsep atau spesialisasi templat apa pun. Ini juga akan berkinerja lambat seperti generik gaya Java karena tampilan tabel virtual, tetapi ini sering dapat menjadi kerugian yang dapat diterima.