Mengapa T () baru tidak dimungkinkan di Java

Orang terkadang berpikir bahwa 'T () baru' akan mungkin jika obat generik direifikasi. Ini tidak benar. Mempertimbangkan:

kelas Foo {

T f = T baru ();

}

Dengan penghapusan, Anda mengimplementasikan 'new T ()' sebagai 'new Object ()', karena Object adalah batas dari T. Dengan reifikasi, Anda membuat instance objek yang kelasnya adalah pengikatan dinamis untuk T di 'this'. Apa pun itu, Anda harus menjalankan konstruktor no-args.

Tetapi Foo tidak mengharuskan tipe yang terikat ke T (alias saksi T) memiliki konstruktor no-args. 'new Foo ()' benar-benar legal, tetapi Integer tidak memiliki konstruktor no-args, jadi bagaimana ekspresi inisialisasi instance seharusnya memanggil 'new T ()'? Itu hampir tidak dapat membuat nilai default untuk diteruskan ke konstruktor Integer.

'new T ()' pada dasarnya tidak mungkin dalam konteks batas tipe nominal . (Atau, jika Anda lebih suka, dalam konteks kompilasi terpisah, karena kompilasi global dapat menghitung bahwa 'T baru ()' adalah suara untuk semua contoh Foo yang diamati.) C # 2.0 memperkenalkan batasan tipe struktural yang disebut batasan baru () untuk mengizinkan 'T ()' baru. Namun, mereka sudah memiliki kebutuhan akan aturan yang menarik tentang tipe mana yang dapat menyaksikan parameter tipe, dan dalam konteks itu "batasan tanpa parameter publik" bersifat langsung. C ++ "konsep" melangkah lebih jauh dalam memungkinkan deskripsi struktural dari tipe yang dapat menyaksikan parameter tipe.

Java tidak akan mendapatkan batasan tipe struktural dalam waktu dekat. Batas jenis nominal dari formulir K&I (jenis persimpangan) cukup rumit. Akibatnya, baik penghapusan maupun reifikasi saja tidak dapat mendukung 'T baru ()'.

Artikel ini, "Mengapa T () baru tidak mungkin dilakukan di Java", awalnya diterbitkan oleh JavaWorld.