Kadang ketika melihat-lihat kode, saya melihat banyak metode menentukan anotasi:
@SuppressWarnings("unchecked")
Apa artinya ini?
Kadang ketika melihat-lihat kode, saya melihat banyak metode menentukan anotasi:
@SuppressWarnings("unchecked")
Apa artinya ini?
Kadang-kadang Java generik hanya tidak membiarkan Anda melakukan apa yang ingin Anda, dan Anda perlu untuk secara efektif memberitahu compiler bahwa apa yang Anda lakukan benar-benar akan menjadi hukum pada waktu eksekusi.
Saya biasanya menemukan ini menyakitkan ketika saya mengejek antarmuka generik, tetapi ada contoh lain juga. Ini biasanya layak mencoba untuk bekerja keluar cara menghindari peringatan daripada menekan itu ( Java Generik FAQ membantu di sini) tapi kadang-kadang bahkan jika ini mungkin, membungkuk kode keluar dari bentuk sehingga menekan peringatan adalah lebih rapi. Selalu tambahkan komentar jelas dalam kasus itu!
FAQ generik yang sama memiliki beberapa bagian pada topik ini, dimulai dengan "Apa itu peringatan" tidak dicentang "?" - Layak dibaca.
(YourClazz<?>)
- Java tidak pernah memperingatkan tentang gips karena aman. Ini tidak akan selalu berhasil (lihat FAQ generik untuk detailnya).Ini adalah anotasi untuk menekan kompilasi peringatan tentang operasi generik yang tidak diperiksa (bukan pengecualian), seperti gips. Ini pada dasarnya menyiratkan bahwa programmer tidak ingin diberitahu tentang ini yang dia sudah sadari ketika mengkompilasi sedikit kode tertentu.
Anda dapat membaca lebih lanjut tentang anotasi khusus ini di sini:
Selain itu, Oracle menyediakan beberapa dokumentasi tutorial tentang penggunaan anotasi di sini:
Seperti yang mereka katakan,
sumber
Ini juga bisa berarti bahwa versi sistem tipe Java saat ini tidak cukup baik untuk kasus Anda. Ada beberapa proposisi / peretasan JSR untuk memperbaikinya: Ketik token, Token Super , Class.cast ().
Jika Anda benar-benar membutuhkan penindasan ini, persempit sebanyak mungkin (mis. Jangan menaruhnya di kelas itu sendiri atau ke metode yang panjang). Sebuah contoh:
sumber
The SuppressWarning penjelasan digunakan untuk peringatan compiler menekan untuk elemen dijelaskan. Secara khusus,
unchecked
kategori ini memungkinkan penindasan peringatan kompiler yang dihasilkan sebagai hasil dari pemeran tipe yang tidak dicentang.sumber
Secara sederhana: Ini adalah peringatan dimana kompiler menunjukkan bahwa ia tidak dapat memastikan keamanan tipe.
Metode layanan JPA misalnya:
Jika saya tidak membuat anotasi @SuppressWarnings ("tidak dicentang") di sini, itu akan memiliki masalah dengan baris, di mana saya ingin mengembalikan Daftar Hasil saya.
Dalam cara pintas ketik-safety berarti: Suatu program dianggap aman-tipe jika ia dikompilasi tanpa kesalahan dan peringatan dan tidak memunculkan ClassCastException yang tidak terduga saat runtime.
Saya membangun di http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html
sumber
Di Jawa, obat generik diimplementasikan dengan cara penghapusan tipe. Misalnya, kode berikut.
Dikompilasi sebagai berikut.
Dan
List.of
didefinisikan sebagai.Yang setelah penghapusan tipe menjadi.
Kompiler tidak tahu apa jenis generik saat runtime, jadi jika Anda menulis sesuatu seperti ini.
Java Virtual Machine tidak tahu jenis generik apa saat menjalankan suatu program, jadi ini mengkompilasi dan berjalan, seperti untuk Java Virtual Machine, ini adalah pemeran untuk
List
mengetik (ini adalah satu-satunya hal yang dapat diverifikasi, sehingga hanya memverifikasi itu).Tapi sekarang tambahkan baris ini.
Dan JVM akan melempar yang tidak terduga
ClassCastException
, ketika kompiler Java memasukkan pemeran implisit.Sebuah
unchecked
peringatan memberitahu seorang programmer yang gips dapat menyebabkan program untuk membuang pengecualian di tempat lain. Menekan peringatan dengan@SuppressWarnings("unchecked")
memberi tahu kompiler bahwa programmer percaya kode aman dan tidak akan menyebabkan pengecualian yang tidak terduga.Mengapa Anda ingin melakukan itu? Sistem tipe Java tidak cukup baik untuk mewakili semua pola penggunaan tipe yang mungkin. Terkadang Anda mungkin tahu bahwa para pemain aman, tetapi Java tidak menyediakan cara untuk mengatakannya - untuk menyembunyikan peringatan seperti ini,
@SupressWarnings("unchecked")
dapat digunakan, sehingga seorang programmer dapat fokus pada peringatan yang sebenarnya. Misalnya,Optional.empty()
mengembalikan tunggal untuk menghindari alokasi opsional kosong yang tidak menyimpan nilai.Pemain ini aman, karena nilai yang disimpan dalam opsional kosong tidak dapat diambil sehingga tidak ada risiko pengecualian pemain kelas yang tidak terduga.
sumber
Anda bisa menekan peringatan kompiler dan memberi tahu para generik bahwa kode yang Anda tulis itu legal menurutnya.
Contoh:
sumber
Salah satu triknya adalah membuat antarmuka yang memperluas antarmuka basis generik ...
Kemudian Anda dapat memeriksanya dengan instanceof sebelum ...
sumber
Sejauh yang saya tahu, untuk saat ini ada hubungannya dengan menekan peringatan tentang obat generik; generik adalah konstruk pemrograman baru yang tidak didukung dalam versi JDK lebih awal dari JDK 5, jadi campuran apa pun dari konstruksi lama dengan yang baru dapat menimbulkan beberapa hasil yang tidak terduga.
Compiler memperingatkan programmer tentang hal itu, tetapi jika programmer sudah tahu, mereka dapat mematikan peringatan yang ditakuti menggunakan SuppressWarnings.
sumber
Peringatan dimana kompiler menunjukkan bahwa ia tidak dapat memastikan keamanan tipe. Istilah "tidak dicentang" peringatan itu menyesatkan. Itu tidak berarti bahwa peringatan itu tidak dicentang dengan cara apa pun. Istilah "tidak dicentang" mengacu pada fakta bahwa kompiler dan sistem runtime tidak memiliki informasi tipe yang cukup untuk melakukan semua pemeriksaan tipe yang diperlukan untuk memastikan keamanan tipe. Dalam pengertian ini, operasi tertentu "tidak dicentang".
Sumber paling umum dari peringatan "tidak dicentang" adalah penggunaan tipe mentah. peringatan "tidak dicentang" dikeluarkan ketika suatu objek diakses melalui variabel tipe mentah, karena tipe mentah tidak menyediakan informasi tipe yang cukup untuk melakukan semua pemeriksaan tipe yang diperlukan.
Contoh (peringatan tidak dicentang bersama dengan jenis mentah):
Ketika metode add dipanggil, kompiler tidak tahu apakah aman untuk menambahkan objek String ke koleksi. Jika TreeSet adalah koleksi yang berisi String s (atau supertype daripadanya), maka itu akan aman. Tetapi dari informasi jenis yang disediakan oleh tipe mentah TreeSet, kompiler tidak dapat memberi tahu. Karenanya panggilan tersebut berpotensi tidak aman dan peringatan "tidak dicentang" dikeluarkan.
peringatan "tidak dicentang" juga dilaporkan ketika kompiler menemukan pemain yang tipe targetnya adalah tipe parameter atau tipe parameter.
Contoh (peringatan yang tidak dicentang bersama dengan gips ke tipe atau variabel tipe parameter):
Pemain yang tipe targetnya adalah tipe parameter (beton atau wildcard) atau parameter tipe tidak aman, jika pemeriksaan tipe dinamis saat runtime terlibat. Saat runtime, hanya tipe erasure yang tersedia, bukan tipe statis persis yang terlihat dalam kode sumber. Akibatnya, bagian runtime dari gips dilakukan berdasarkan pada tipe erasure, bukan pada tipe statis yang tepat.
Dalam contoh tersebut, para pemain ke Wrapper akan memeriksa apakah objek yang kembali dari super.clone adalah Wrapper, bukan apakah itu adalah wrapper dengan tipe anggota tertentu. Demikian pula, gips ke parameter tipe T dilemparkan untuk mengetik Objek saat runtime, dan mungkin dioptimalkan sekaligus. Karena penghapusan tipe, sistem runtime tidak dapat melakukan pemeriksaan tipe yang lebih berguna saat runtime.
Di satu sisi, kode sumber menyesatkan, karena itu menunjukkan bahwa pemain untuk jenis target masing-masing dilakukan, sementara pada kenyataannya bagian dinamis pemain hanya memeriksa terhadap penghapusan jenis jenis target. Peringatan "tidak dicentang" dikeluarkan untuk menarik perhatian programmer ke ketidakcocokan antara aspek statis dan dinamis para pemain.
Silakan merujuk: Apa itu peringatan "tidak dicentang"?
sumber
Anotasi @SuppressWarnings adalah salah satu dari tiga anotasi bawaan yang tersedia di JDK dan ditambahkan bersama @Override dan @Deprecated di Java 1.5.
@SuppressWarnings memerintahkan kompiler untuk mengabaikan atau menekan, peringatan kompiler yang ditentukan dalam elemen beranotasi dan semua elemen program di dalam elemen itu. Misalnya, jika kelas diberi penjelasan untuk menekan peringatan tertentu, maka peringatan yang dihasilkan dalam metode di dalam kelas itu juga akan dipisahkan.
Anda mungkin telah melihat @SuppressWarnings ("tidak dicentang") dan @SuppressWarnings ("serial"), dua contoh paling populer dari anotasi @SuppressWarnings. Mantan digunakan untuk menekan peringatan yang dihasilkan karena pengecoran tidak dicentang sementara peringatan kemudian digunakan untuk mengingatkan tentang menambahkan SerialVersionUID dalam kelas Serializable.
Baca selengkapnya: https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzz5rqQaOLUa
sumber