Saya telah melihat karakter pengganti yang digunakan sebelumnya untuk mengartikan objek apa pun - tetapi baru-baru ini saya melihat penggunaan:
<? extends Object>
Karena semua objek memperluas Object, apakah kedua penggunaan ini sama?
Saya telah melihat karakter pengganti yang digunakan sebelumnya untuk mengartikan objek apa pun - tetapi baru-baru ini saya melihat penggunaan:
<? extends Object>
Karena semua objek memperluas Object, apakah kedua penggunaan ini sama?
Jawaban:
<?>dan <? extends Object>identik, seperti yang Anda harapkan.
Ada beberapa kasus dengan obat generik extends Objectyang sebenarnya tidak berlebihan. Misalnya, <T extends Object & Foo>akan menyebabkan Tmenjadi di Objectbawah penghapusan, sedangkan dengan <T extends Foo>itu akan menjadi di Foobawah penghapusan. (Ini dapat menjadi masalah jika Anda mencoba mempertahankan kompatibilitas dengan API pra-generik yang digunakan Object.)
Sumber: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; ini menjelaskan mengapa kelas JDK java.util.Collectionsmemiliki metode dengan tanda tangan ini:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Objectsebenarnya adalah bermakna. Jika saya salah, maka saya minta maaf. Mudah-mudahan akan menarik bagi orang lain yang mengetahui pertanyaan Anda, setidaknya.
Meskipun <?>seharusnya menjadi jalan pintas <? extend object>, ada sedikit perbedaan di antara keduanya.
<?>dapat diverifikasi sedangkan <? extend object>tidak. Alasan mereka melakukan ini adalah agar lebih mudah membedakan jenis yang dapat diubah. Apa pun yang terlihat seperti <? extends something>, <T>, <Integer>yang nonreifiable.
Misalnya, kode ini akan berfungsi
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
tapi ini memberikan kesalahan
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
untuk info lebih lanjut baca generik Java dan koleksi oleh Maurice Naftalin
<?>adalah singkatan dari <? extends Object>. Anda dapat membaca tautan bersama di bawah ini untuk lebih jelasnya.
<?>
"?"menunjukkan jenis yang tidak diketahui, Ini dapat mewakili Jenis apa pun di dalam kode untuk. Gunakan wildcard ini jika Anda tidak yakin tentang Type.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Catatan: <?> berarti apa saja. Sehingga bisa menerima Type yang tidak diwarisi dari Objectclass.
<? extends Object>
<? extends Object>berarti Anda dapat mengirimkan Objek atau sub-kelas yang memperluas Objectkelas.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - digunakan untuk menunjukkan tipe
E - digunakan untuk menunjukkan elemen
K - kunci
V - nilai
N - untuk angka
Ref:
Objectkelas.