Rumah > Java > javaTutorial > Cara menggunakan Koleksi bekas generik java

Cara menggunakan Koleksi bekas generik java

WBOY
Lepaskan: 2023-04-19 18:10:42
ke hadapan
800 orang telah melayarinya

Mari kita ambil contoh ringkas:

<code>public void testGenerics() {<br>    Collection<Number> numbers = new ArrayList<>();<br>    numbers.add(1); // ok<br>    numbers.add(0.1); // ok<br><br>    Collection<? extends Number> numbers2 = new ArrayList<>();<br>    // don't work, you don't know which subtype 'numbers2' exactly contains<br>    numbers2.add(1); // oops!<br>}<br></code>
Salin selepas log masuk

Contoh ini sebenarnya agak anti-manusia Dianggarkan bahawa reaksi pertama kebanyakan orang (termasuk saya) terhadap penukaran ini mestilah "sudah tentu betul" ( Ini perangkap), izinkan saya memberitahu anda pemahaman saya:

  • Koleksi: Menunjukkan bahawa Koleksi ini mengandungi objek jenis Nombor, yang boleh menjadi Integer/ Long/Float , kerana pengkompil boleh menentukan bahawa obj instanceof Number == true;

  • Koleksi/Collection, jadi memanggil nombor2.add(1) tidak akan berfungsi, kerana pengkompil tidak mengetahui subjenis Nombor yang mana elemen yang terkandung dalam nombor2, dan pengkompil tidak boleh tentukan hasil obj instanceof UnknownType;

  • Koleksi, jenis E ini ialah jenis khusus "a" dan tidak boleh menjadi pemegang tempat yang mewakili berbilang subjenis induk

Contoh lain:

<code>public void testGenerics() {<br>    Collection<Number> numbers = new ArrayList<>();<br>    Collection<Integer> integers = new ArrayList<>();<br>    Collection<? extends Number> numbers2 = new ArrayList<>();<br>    <br>    numbers2 = integers; // ok<br>    numbers2 = numbers; // ok<br>    <br>    // don't work, Collection<Number> != Collection<Integer><br>    numbers = integers; // oops!<br>}<br></code>
Salin selepas log masuk

Integer jelas mewarisi Nombor, jadi mengapa

  • Koleksi

tidak benar, mari kita lihat contoh lain:

<code>public void testGenerics() {<br>    Collection<Integer> profits = new ArrayList<>();<br>    <br>    insertSomething(profits); // line 1<br>    <br>    Integer profit = profits.iterator().next(); // oops! crash<br>}<br><br>private void insertSomething(Collection<Number> numbers) {<br>    numbers.add(Long.MAX_VALUE);<br>}<br></code>
Salin selepas log masuk

Jika baris 1 benar, maka keuntungan seterusnya ialah nombor negatif, dan satu siri daripada pengiraan seterusnya Pengecualian akan dilemparkan Jika kod tidak cukup mantap, beberapa RuntimeExceptions yang tidak dijangka mungkin dilemparkan, menyebabkan kaedah berakhir secara tidak normal atau malah program ranap.

Jadi dalam satu ayat, Koleksi != Koleksi adalah untuk keselamatan masa jalan dan kemungkinan pengecualian jenis penukaran akan diselesaikan pada masa penyusunan.

Sekarang mari kita bercakap tentang Koleksi dan Koleksi Reaksi pertama ramai orang (termasuk saya) mestilah “Objek ialah kelas induk biasa bagi semua objek java, jadi Koleksi<. "Objek> boleh mewakili sebarang jenis koleksi ", mari lihat contoh:

<code>public void testGenerics2() {<br>    Collection<Integer> integers = new ArrayList<>();<br><br>    Collection<?> objects2 = integers; // ok<br>    // don't work, which type of 'objects2' contains is uncertain<br>    objects2.add(1); // oops!<br>    <br>    Collection<Object> objects = integers; // oops!<br>}<br></code>
Salin selepas log masuk
  • Koleksi mewakili julat yang lebih besar daripada Koleksi;

  • Objects2.add(1) tidak boleh dipanggil kerana pengkompil tidak boleh membuat kesimpulan dengan tepat objek2 bekas jenis data yang mana dan pengecualian penukaran jenis masa jalan mungkin berlaku

  • Cara yang betul untuk menulis koleksi mana-mana jenis data ialah Koleksi;

  • Koleksi

Mengapa Koleksi sebenarnya, pengkompil berpendapat terdapat risiko ralat penukaran jenis:

<code>public void testGenerics() {<br>    Collection<Integer> integers = new ArrayList<>();<br><br>    Collection<Object> objects = integers; // oops!<br>    // don't work, which type of 'objects2' contains is uncertain<br>    objects.add("1");<br><br>    Integer one = objects.iterator().next(); // oops! crash<br>}<br></code>
Salin selepas log masuk
  • Koleksi boleh menambah data pada bekas, kerana Object ialah kelas induk bagi semua objek dan merupakan jenis yang diketahui, yang boleh dinilai oleh obj instanceof Object;

  • KoleksiTidak boleh meletakkan data ke dalam bekas kerana ? (UnknownType) ialah jenis yang tidak diketahui dan hasil daripada obj instanceof UnknownType tidak boleh dinilai; 🎜>? mewakili jenis yang tidak diketahui, dan Object mewakili jenis yang diketahui; ranap dalam contoh di atas pasti akan berlaku. . (Satu lagi gangguan dalam talian)

Atas ialah kandungan terperinci Cara menggunakan Koleksi bekas generik java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan