Pertanyaan saya adalah seperti di atas. Maaf, ini mungkin duplikat tetapi saya tidak dapat menemukan contoh dengan <?>
di akhir.
Mengapa Anda tidak hanya menggunakan Class
sebagai parameter?
Pertanyaan saya adalah seperti di atas. Maaf, ini mungkin duplikat tetapi saya tidak dapat menemukan contoh dengan <?>
di akhir.
Mengapa Anda tidak hanya menggunakan Class
sebagai parameter?
Jawaban:
Class
adalah kelas parameterizable, maka Anda dapat menggunakan sintaksis di Class<T>
mana T
tipe. Dengan menulis Class<?>
, Anda mendeklarasikan Class
objek yang bisa dari jenis apa pun ( ?
adalah wildcard). The Class
tipe adalah tipe yang berisi meta-informasi tentang kelas.
Itu selalu merupakan praktik yang baik untuk merujuk ke tipe generik dengan menentukan tipe spesifiknya, dengan menggunakan Class<?>
Anda menghormati praktik ini (Anda sadar Class
akan parameterabel) tetapi Anda tidak membatasi parameter Anda untuk memiliki tipe tertentu.
Referensi tentang Generik dan Wildcard: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Referensi tentang Class
objek dan refleksi (fitur bahasa Jawa yang digunakan untuk mengintrospeksi dirinya sendiri): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
tanpa tipe? Mereka sepertinya mewakili hal yang sama.
?
wildcard." . Jika Anda tidak memberikan wildcard, kompilator mengasumsikan bahwa Anda lupa jenisnya atau tidak tahu kelasnya generik dan akan memperingatkan Anda tentang hal itu.
Class<?>
Class
tidak bisa lolos ke argumen jenis ini Class<?>
, Jadi Class<?>
lebih nyaman untuk semua situasi.
Ini <?>
adalah binatang buas. Ini sering menyebabkan kebingungan dan kesalahan, karena, ketika Anda melihatnya pertama kali, maka Anda mulai percaya, <?>
adalah wildcard untuk semua tipe java . Itu .. tidak benar. <?>
adalah tipe yang tidak diketahui , sedikit perbedaan dan tidak menyenangkan.
Itu tidak masalah ketika Anda menggunakannya Class
. Kedua baris berfungsi dan kompilasi:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Tetapi - jika kita mulai menggunakannya dengan koleksi, maka kita melihat kesalahan waktu ganti yang aneh:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Kami List<?>
bukan koleksi, yang cocok untuk sembarang jenis objek. Itu hanya dapat menyimpan satu jenis: mistik "tipe tidak dikenal". Yang bukan tipe nyata, pasti.
Ini berarti referensi Kelas Anda dapat menyimpan referensi ke objek Kelas apa pun.
Ini pada dasarnya sama dengan "Kelas" tetapi Anda menunjukkan kepada orang lain yang membaca kode Anda bahwa Anda tidak melupakan obat generik, Anda hanya ingin referensi yang dapat menampung objek Kelas apa saja.
Bruce Eckel, Berpikir di Jawa:
Di Java SE5, Kelas <?> Lebih disukai daripada Kelas biasa, meskipun mereka setara dan Kelas biasa, seperti yang Anda lihat, tidak menghasilkan peringatan kompiler. Manfaat dari Kelas <?> Adalah bahwa ini menunjukkan bahwa Anda tidak hanya menggunakan referensi kelas non-spesifik karena kecelakaan, atau karena ketidaktahuan. Anda memilih versi yang tidak spesifik.
Ini adalah literal generik . Ini berarti bahwa Anda tidak tahu jenis kelas Class
yang diwakili oleh instance ini, tetapi Anda masih menggunakan versi generik.
Class<Foo>
. Dengan begitu Anda dapat membuat instance baru, misalnya, tanpa casting:Foo foo = clazz.newInstance();