@Dan Jika Anda mencari "? Extends Object" dalam pertanyaan itu, Anda tidak akan menemukan apa pun. Saya membaca jawaban untuk melihat apakah saya dapat menyimpulkan sesuatu tetapi saya tidak berpikir ini dia. Secara khusus, ini tidak berbicara tentang obat generik.
orbfish
@Dan - Itu pertanyaan yang berbeda. Saya telah melihat pertanyaan ini sebelumnya dan saya ingat setidaknya satu penyebutan perbedaan yang halus. Biarkan saya melihat apakah saya dapat menemukannya ..
Ini dia: kemungkinan duplikat wildcard Tak Terbatas di Java (Menampilkan jawaban yang salah oleh Kevin Bourrillion tidak kurang.)
Paul Bellora
Jawaban:
104
<?>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.)
Saya tidak jelas bagaimana hubungannya dengan contoh tersebut? (karena tidak menggunakan <?> atau <? extends Object>)
orbfish
27
@orbfish: Hal ini terkait hanya dalam yang saya pikir Anda akan menemukan hal menarik, karena ini adalah contoh di mana extends Objectsebenarnya adalah bermakna. Jika saya salah, maka saya minta maaf. Mudah-mudahan akan menarik bagi orang lain yang mengetahui pertanyaan Anda, setidaknya.
ruakh
@ruakh - Lebih tertarik dengan karakter pengganti yang dibatasi daripada parameter jenis, tapi, setidaknya, Anda menjawab.
orbfish
1
Anda harus menyatakan itu di posting asli Anda. Dengan begitu, jawabannya bisa jadi lebih relevan bagi Anda.
liltitus 27
19
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 =newArrayList<>();boolean instanceTest = aList instanceofList<?>;
tapi ini memberikan kesalahan
List aList =newArrayList<>();boolean instancetest = aList instanceofList<?extendsObject>;
untuk info lebih lanjut baca generik Java dan koleksi oleh Maurice Naftalin
Bagaimana List <?> Menjadi reifiable jika compiler akan menerjemahkannya ke List <Object> jadi informasi tentang apa tipenya? hilang?
Trismegistos
Apa yang saya yakini <?> Lebih dirancang untuk kompatibel ke belakang dengan API lama. membedakan dengan <Object> dan <? extends Object> yang merupakan kode post Java 5.
Dennis C
9
<?>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 =newArrayList<Number>();//can accept of type Number
unknownList =newArrayList<Float>();//Float is of type Number
Catatan:<?> berarti apa saja. Sehingga bisa menerima Type yang tidak diwarisi dari Objectclass.
<?extendsObject>
<? extends Object>berarti Anda dapat mengirimkan Objek atau sub-kelas yang memperluas Objectkelas.
ArrayList<?extendsNumber> numberList =newArrayList<Number>();//Number of subclass
numberList =newArrayList<Integer>();//Integer extends Number
numberList =newArrayList<Float>();// Float extends Number
T - digunakan untuk menunjukkan tipe
E - digunakan untuk menunjukkan elemen
K - kunci
V - nilai
N - untuk angka Ref:
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 menyebabkanT
menjadi diObject
bawah penghapusan, sedangkan dengan<T extends Foo>
itu akan menjadi diFoo
bawah penghapusan. (Ini dapat menjadi masalah jika Anda mencoba mempertahankan kompatibilitas dengan API pra-generik yang digunakanObject
.)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:sumber
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
tapi ini memberikan kesalahan
untuk info lebih lanjut baca generik Java dan koleksi oleh Maurice Naftalin
sumber
<?>
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.Catatan:
<?>
berarti apa saja. Sehingga bisa menerima Type yang tidak diwarisi dariObject
class.<? extends Object>
berarti Anda dapat mengirimkan Objek atau sub-kelas yang memperluasObject
kelas.T - digunakan untuk menunjukkan tipe
E - digunakan untuk menunjukkan elemen
K - kunci
V - nilai
N - untuk angka
Ref:
sumber
Object
kelas.