Pertanyaan saya adalah seperti di atas. Maaf, ini mungkin duplikat tetapi saya tidak dapat menemukan contoh dengan <?>di akhir.
Mengapa Anda tidak hanya menggunakan Classsebagai 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 Classsebagai parameter?
Jawaban:
Classadalah kelas parameterizable, maka Anda dapat menggunakan sintaksis di Class<T>mana Ttipe. Dengan menulis Class<?>, Anda mendeklarasikan Classobjek yang bisa dari jenis apa pun ( ?adalah wildcard). The Classtipe 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 Classakan 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 Classobjek dan refleksi (fitur bahasa Jawa yang digunakan untuk mengintrospeksi dirinya sendiri): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Classtanpa 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<?>
Classtidak 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 Classyang 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();