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
Koleksi/Collection
Koleksi
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
Sekarang mari kita bercakap tentang Koleksi
<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
<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
Atas ialah kandungan terperinci Cara menggunakan Koleksi bekas generik java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!