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 Object
yang sebenarnya tidak berlebihan. Misalnya, <T extends Object & Foo>
akan menyebabkan T
menjadi di Object
bawah penghapusan, sedangkan dengan <T extends Foo>
itu akan menjadi di Foo
bawah 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.Collections
memiliki metode dengan tanda tangan ini:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
sebenarnya 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 Object
class.
<? extends Object>
<? extends Object>
berarti Anda dapat mengirimkan Objek atau sub-kelas yang memperluas Object
kelas.
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:
Object
kelas.