Apa yang dimaksud dengan Kelas <?> Di Jawa?

Jawaban:

109

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

manub
sumber
7
Apa manfaat melakukan ini lebih dari sekadar menggunakan Classtanpa tipe? Mereka sepertinya mewakili hal yang sama.
ashes999
1
Saya pikir inti dari generik adalah Anda tidak tahu jenis kelas di muka. Kalau tidak, Anda hanya akan mendefinisikan fungsi untuk menggunakan tipe kelas tertentu untuk parameter. Tanda tanya ini masih tidak masuk akal.
Brain2000
5
Tidak ada manfaat lain kecuali Anda memberi tahu kompiler bahwa "Saya tahu ini adalah kelas generik, tetapi saya tidak tahu atau peduli dengan tipe yang sebenarnya, jadi alih-alih memberikan tipe konkret, saya memberikan ?wildcard." . Jika Anda tidak memberikan wildcard, kompilator mengasumsikan bahwa Anda lupa jenisnya atau tidak tahu kelasnya generik dan akan memperingatkan Anda tentang hal itu.
Kayaman
1
Apa yang setara dengan KotlinClass<?>
JGuo
hanya Classtidak bisa lolos ke argumen jenis ini Class<?>, Jadi Class<?>lebih nyaman untuk semua situasi.
petertc
72

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.

Andreas Dolk
sumber
8

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.

Filip
sumber
1
Kutipan mengatakan "Kelas <?> Lebih disukai daripada Kelas biasa" dan "Manfaat Kelas <?>". Tampaknya blockquote tidak setuju dengan tanda kurung sudut.
Filipi
1
Itu harus diloloskan. Perbaiki sekarang: P
Sami Kuhmonen
5

Ini adalah literal generik . Ini berarti bahwa Anda tidak tahu jenis kelas Classyang diwakili oleh instance ini, tetapi Anda masih menggunakan versi generik.

  • jika Anda tahu kelasnya, Anda akan menggunakannya Class<Foo>. Dengan begitu Anda dapat membuat instance baru, misalnya, tanpa casting:Foo foo = clazz.newInstance();
  • jika Anda tidak menggunakan obat generik sama sekali, Anda akan mendapatkan peringatan setidaknya (dan tidak menggunakan obat generik umumnya tidak dianjurkan karena dapat menyebabkan efek samping yang sulit dideteksi)
Bozho
sumber
5

Dalam generik, tipe yang tidak dikenal diwakili oleh karakter wildcard "?". Baca di sini untuk contoh resmi.

Jasonw
sumber
3

Itu berarti Kelas dengan jenis apa pun (tidak diketahui).

Anda harus membaca tutorial java generics untuk memahaminya dengan lebih baik

fmucar
sumber