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

Cara menggunakan Koleksi bekas generik java

WBOY
WBOYke hadapan
2023-04-19 18:10:42798semak imbas

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>

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>

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>

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>
  • 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>
  • 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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam