Saya membuat beberapa kelas secara dinamis menggunakan sun.misc.Unsafedan itu memberikan petunjuk ini pada output
Davut Gürbüz
Jawaban:
392
Ini muncul di Java 5 dan yang lebih baru jika Anda menggunakan koleksi tanpa tipe penentu (mis., Arraylist()Bukannya ArrayList<String>()). Ini berarti bahwa kompiler tidak dapat memeriksa bahwa Anda menggunakan koleksi dengan cara yang aman, menggunakan obat generik .
Untuk menghilangkan peringatan, cukup spesifik tentang jenis objek apa yang Anda simpan dalam koleksi. Jadi, bukannya
List myList =newArrayList();
menggunakan
List<String> myList =newArrayList<String>();
Di Java 7 Anda dapat mempersingkat instantiasi umum dengan menggunakan Type Inference .
Di Java 7, saya mendapat peringatan yang sama bahkan menggunakan Type Interference dengan koleksi ini:ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
Lucio
13
@ Lucio Anda masih membutuhkan kurung sudut. new ConcurrentHashMap<>()
Bill the Lizard
3
Hanya untuk menunjukkan, ini bukan koleksi khusus. Anda mendapatkan kesalahan karena Java compiler tidak dapat memastikan keamanan tipe secara umum. Misalnya, peringatan yang sama dihasilkan dengan kode berikut: AbstractMap.SimpleEntry <String, String> entry = new AbstractMap.SimpleEntry ("hello", "world");
Jika Anda melakukan apa yang disarankan dan mengkompilasi ulang dengan sakelar "-Xlint: unchecked", itu akan memberi Anda informasi yang lebih terperinci.
Seperti halnya penggunaan jenis mentah (seperti yang dijelaskan oleh jawaban lain), gips yang tidak dicentang juga dapat menyebabkan peringatan.
Setelah dikompilasi dengan -Xlint, Anda harus dapat mengolah kode Anda untuk menghindari peringatan. Ini tidak selalu memungkinkan, terutama jika Anda mengintegrasikan dengan kode lawas yang tidak dapat diubah. Dalam situasi ini, Anda dapat memutuskan untuk menekan peringatan di tempat-tempat di mana Anda tahu bahwa kode itu benar:
Saya berharap lebih banyak orang akan membenarkan jawaban ini. Saya mendukung pilihan @Bill the Lizard, tetapi jawaban ini dekat dengan hati saya karena menunjukkan kepada saya bahwa jawabannya menatap langsung ke wajah saya dalam peringatan itu sendiri serta menguraikan alasan lain untuk menemukan kesalahan.
toolbear
1
Ini jawaban pamungkas!
russellhoff
Jawaban ini seharusnya ditandai sebagai solusi! Terima kasih!
terima kasih, saya menemukan dari mana peringatan saya berasal dengan menambahkan ini
JackOuttaBox
Saya mendapatkan peringatan ini dan AS menunjukkan kelas di mana ia diproduksi. Dan ini bukan kesalahan, hanya peringatan. Mengapa kita harus menambahkan opsi ini? Bukankah kelas masalah ditunjukkan dalam situasi Anda?
CoolMind
Lol, saya hanya menjawab pertanyaan, dan tidak , masalahnya tidak ditampilkan sampai Anda menambahkan ini.
Borzh
16
Peringatan ini berarti bahwa kode Anda beroperasi pada tipe mentah, kompilasi ulang contoh dengan
Peringatan "operasi tidak dicentang atau tidak aman" ditambahkan ketika java menambahkan Generics , jika saya ingat dengan benar. Biasanya meminta Anda untuk lebih eksplisit tentang jenis, dengan satu atau lain cara.
Sebagai contoh. kode ArrayList foo = new ArrayList();memicu peringatan itu karena javac sedang mencariArrayList<String> foo = new ArrayList<String>();
Saya hanya ingin menambahkan satu contoh jenis peringatan yang tidak dicentang yang sering saya lihat. Jika Anda menggunakan kelas yang mengimplementasikan antarmuka seperti Serializable, seringkali Anda akan memanggil metode yang mengembalikan objek antarmuka, dan bukan kelas yang sebenarnya. Jika kelas yang dikembalikan harus dilemparkan ke tipe berdasarkan generik, Anda bisa mendapatkan peringatan ini.
Berikut adalah contoh singkat (dan agak konyol) untuk diperagakan:
import java.io.Serializable;publicclassSimpleGenericClass<T>implementsSerializable{publicSerializable getInstance(){returnthis;}// @SuppressWarnings("unchecked")publicstaticvoid main(){SimpleGenericClass<String> original =newSimpleGenericClass<String>();// java: unchecked cast// required: SimpleGenericClass<java.lang.String>// found: java.io.SerializableSimpleGenericClass<String> returned =(SimpleGenericClass<String>) original.getInstance();}}
getInstance () mengembalikan objek yang mengimplementasikan Serializable. Ini harus dilemparkan ke jenis yang sebenarnya, tetapi ini adalah pemain yang tidak dicentang.
Anda dapat menyimpannya dalam bentuk umum dan menuliskannya sebagai:
// list 2 is made generic and can store any type of ObjectArrayList<Object> list2 =newArrayList<Object>();
Mengatur jenis ArrayList sebagai Objek memberi kita keuntungan untuk menyimpan semua jenis data. Anda tidak perlu menggunakan -Xlint atau yang lainnya.
Saya punya ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;. Karena valuemerupakan struktur yang kompleks (saya ingin membersihkan JSON ), dapat terjadi kombinasi pada angka, boolean, string, array. Jadi, saya menggunakan solusi @Dan Dyer:
sun.misc.Unsafe
dan itu memberikan petunjuk ini pada outputJawaban:
Ini muncul di Java 5 dan yang lebih baru jika Anda menggunakan koleksi tanpa tipe penentu (mis.,
Arraylist()
BukannyaArrayList<String>()
). Ini berarti bahwa kompiler tidak dapat memeriksa bahwa Anda menggunakan koleksi dengan cara yang aman, menggunakan obat generik .Untuk menghilangkan peringatan, cukup spesifik tentang jenis objek apa yang Anda simpan dalam koleksi. Jadi, bukannya
menggunakan
Di Java 7 Anda dapat mempersingkat instantiasi umum dengan menggunakan Type Inference .
sumber
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
dengan MAVENJika Anda melakukan apa yang disarankan dan mengkompilasi ulang dengan sakelar "-Xlint: unchecked", itu akan memberi Anda informasi yang lebih terperinci.
Seperti halnya penggunaan jenis mentah (seperti yang dijelaskan oleh jawaban lain), gips yang tidak dicentang juga dapat menyebabkan peringatan.
Setelah dikompilasi dengan -Xlint, Anda harus dapat mengolah kode Anda untuk menghindari peringatan. Ini tidak selalu memungkinkan, terutama jika Anda mengintegrasikan dengan kode lawas yang tidak dapat diubah. Dalam situasi ini, Anda dapat memutuskan untuk menekan peringatan di tempat-tempat di mana Anda tahu bahwa kode itu benar:
sumber
Untuk Android Studio, Anda perlu menambahkan:
di file build.gradle proyek Anda untuk mengetahui di mana kesalahan ini terjadi.
sumber
Peringatan ini berarti bahwa kode Anda beroperasi pada tipe mentah, kompilasi ulang contoh dengan
untuk mendapatkan detailnya
seperti ini:
docs.oracle.com membicarakannya di sini: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
sumber
Saya memiliki kelas 2 tahun dan beberapa kelas baru. Saya menyelesaikannya di Android Studio sebagai berikut:
Dalam file build.gradle proyek saya ( solusi Borzh )
Dan kemudian jika beberapa Metheds tersisa:
sumber
misalnya ketika Anda memanggil fungsi yang mengembalikan Koleksi Generik dan Anda tidak menentukan sendiri parameter generik.
untuk suatu fungsi
akan menghasilkan kesalahan ini.
Untuk mengatasinya Anda hanya perlu menambahkan parameter
sumber
Peringatan "operasi tidak dicentang atau tidak aman" ditambahkan ketika java menambahkan Generics , jika saya ingat dengan benar. Biasanya meminta Anda untuk lebih eksplisit tentang jenis, dengan satu atau lain cara.
Sebagai contoh. kode
ArrayList foo = new ArrayList();
memicu peringatan itu karena javac sedang mencariArrayList<String> foo = new ArrayList<String>();
sumber
Saya hanya ingin menambahkan satu contoh jenis peringatan yang tidak dicentang yang sering saya lihat. Jika Anda menggunakan kelas yang mengimplementasikan antarmuka seperti Serializable, seringkali Anda akan memanggil metode yang mengembalikan objek antarmuka, dan bukan kelas yang sebenarnya. Jika kelas yang dikembalikan harus dilemparkan ke tipe berdasarkan generik, Anda bisa mendapatkan peringatan ini.
Berikut adalah contoh singkat (dan agak konyol) untuk diperagakan:
getInstance () mengembalikan objek yang mengimplementasikan Serializable. Ini harus dilemparkan ke jenis yang sebenarnya, tetapi ini adalah pemain yang tidak dicentang.
sumber
Solusinya adalah dengan menggunakan tipe spesifik
<>
sepertiArrayList<File>
.contoh:
kode di atas menghasilkan peringatan karena
ArrayList
bukan tipe tertentu.kode di atas akan baik-baik saja. Hanya perubahan yang ada di baris ketiga setelahnya
ArrayList
.sumber
Anda dapat menyimpannya dalam bentuk umum dan menuliskannya sebagai:
Mengatur jenis ArrayList sebagai Objek memberi kita keuntungan untuk menyimpan semua jenis data. Anda tidak perlu menggunakan -Xlint atau yang lainnya.
sumber
Peringatan ini juga dapat dinaikkan karena
HashMap baru () atau ArrayList baru () yang merupakan tipe generik harus spesifik jika tidak, kompiler akan menghasilkan peringatan.
Harap pastikan bahwa jika kode Anda berisi yang berikut, Anda harus mengubahnya sesuai
HashMap baru () => Peta peta = HashMap baru () HashMap baru () => Peta peta = HashMap baru <> ()
ArrayList baru () => Daftar peta = ArrayList baru () ArrayList baru () => Daftar peta = ArrayList baru <> ()
sumber
Saya punya
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Karenavalue
merupakan struktur yang kompleks (saya ingin membersihkan JSON ), dapat terjadi kombinasi pada angka, boolean, string, array. Jadi, saya menggunakan solusi @Dan Dyer:sumber