Rumah >Java >javaTutorial >Mengapa Saya Tidak Boleh Mengisytiharkan Susunan Senarai Generik di Java?

Mengapa Saya Tidak Boleh Mengisytiharkan Susunan Senarai Generik di Java?

Susan Sarandon
Susan Sarandonasal
2024-11-03 13:05:03807semak imbas

Why Can't I Declare an Array of Generic Lists in Java?

Pemadaman Tidak Lengkap dalam Tatasusunan Generik

Tatasusunan generik menimbulkan cabaran unik di Jawa kerana konsep pemadaman jenis. Artikel ini meneroka perbezaan antara dua serpihan kod yang kelihatan serupa dan menerangkan sebab asas kelakuan pengkompil.

Sintaksis dan Semantik

Pertimbangkan kod berikut:

<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>

Kod ini menyusun tanpa masalah, kerana ia mencipta contoh ArrayList generik. Walau bagaimanapun, kod berikut mengakibatkan ralat penyusunan:

<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>

Menyingkap Pemadaman Jenis

Untuk memahami percanggahan, kita mesti mendalami konsep pemadaman jenis. Semasa penyusunan, maklumat jenis generik dipadamkan, yang bermaksud bahawa pada masa jalan, hanya jenis mentah (dalam kes ini, ArrayList) tersedia.

Array Mentah lwn. Senarai Khusus Jenis

Tatasusunan memerlukan jenis mentah, manakala serpihan kod pertama mencipta rujukan kepada senarai generik (ArrayList) tanpa sebarang maklumat jenis tambahan. Oleh itu, pengkompil tidak mempunyai masalah untuk menyelesaikan jenis.

Walau bagaimanapun, serpihan kod kedua cuba mencipta tatasusunan rujukan kepada senarai generik. Ini melanggar peraturan keselamatan jenis kerana tatasusunan bukan jenis parametrik dan tidak boleh menerima pembolehubah jenis atau jenis berparameter.

Penyelesaian Typecast

Untuk memintas had ini, kami boleh menaip tatasusunan seperti berikut:

<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>

Dengan menyatakan secara eksplisit maklumat jenis generik dalam pelakon, kami memaklumkan pengkompil tentang jenis elemen tatasusunan yang dimaksudkan. Ini memenuhi keperluan keselamatan jenis pengkompil.

Pendekatan Senarai Senarai (LL)

Sebaliknya, kita boleh menggunakan senarai senarai:

<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>

Ini sah kerana ArrayList bukan array. Setiap elemen dalam ArrayList luar ialah ArrayList, yang merupakan jenis instantiated sepenuhnya.

Keselamatan dan Rasional Jenis

Sekatan pengkompil pada tatasusunan generik disediakan untuk menguatkuasakan keselamatan jenis. Tanpa semakan ini, adalah mudah untuk memperkenalkan ralat masa jalan yang halus dengan memberikan senarai jenis yang berbeza kepada tatasusunan senarai generik.

Dengan memahami sebab di sebalik tingkah laku pengkompil, kami boleh membuat keputusan termaklum tentang masa dan cara untuk menggunakan tatasusunan generik dan senarai senarai, memastikan kedua-dua kod ketepatan dan kebolehselenggaraan.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengisytiharkan Susunan Senarai Generik di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn