Sudah umum diterima bahwa generik Java gagal dalam beberapa hal penting. Kombinasi kartu liar dan batas menyebabkan beberapa kode serius tidak dapat dibaca.
Namun, ketika saya melihat bahasa lain, saya benar-benar tidak bisa menemukan sistem tipe generik yang disukai oleh para programmer.
Jika kami mengambil yang berikut sebagai sasaran desain sistem tipe seperti itu:
- Selalu menghasilkan deklarasi tipe yang mudah dibaca
- Mudah dipelajari (tidak perlu memoles kovarians, contravariance, dll.)
- memaksimalkan jumlah kesalahan waktu kompilasi
Apakah ada bahasa yang benar? Jika saya google, satu-satunya hal yang saya lihat adalah keluhan tentang bagaimana sistem jenis mengisap dalam bahasa X. Apakah kompleksitas semacam ini melekat dalam pengetikan generik? Haruskah kita menyerah untuk mencoba memverifikasi keamanan tipe 100% pada waktu kompilasi?
Pertanyaan utama saya adalah bahasa mana yang “paling benar” yang terbaik sehubungan dengan ketiga tujuan ini. Saya menyadari bahwa itu subjektif, tetapi sejauh ini saya bahkan tidak dapat menemukan satu bahasa di mana tidak semua programmer setuju bahwa sistem tipe generik berantakan.
Tambahan: seperti yang disebutkan, kombinasi subtyping / inheritance dan generik adalah yang menciptakan kompleksitas, jadi saya benar-benar mencari bahasa yang menggabungkan keduanya dan menghindari ledakan kompleksitas.
Foo<T> where SiameseCat:T
) dan bahwa tidak ada kemungkinan memiliki tipe generik yang tidak dapat dikonversi Object
. IMHO, .NET akan mendapat manfaat dari tipe agregat yang mirip dengan struktur, tetapi bahkan lebih bertulang. Jika KeyValuePair<TKey,TValue>
jenis seperti itu, maka sebuah IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
dapat dilemparkan ke IEnumerable<KeyValuePair<Animal,Vehicle>>
, tetapi hanya jika jenisnya tidak bisa kotak.
easy-to-read type declarations
? Kriteria ketiga juga ambigu: misalnya, saya dapat mengubah indeks array dari batas menjadi kesalahan waktu kompilasi dengan tidak membiarkan Anda indeks array kecuali saya dapat menghitung indeks pada waktu kompilasi. Juga, kriteria kedua mengesampingkan subtyping. Itu tidak selalu merupakan hal yang buruk tetapi Anda harus menyadari apa yang Anda minta.