Saya membaca kode Guava di mana saya menemukan anotasi java.util.@Nullable
dalam beberapa kode. Saya tahu artinya @Nullable
, tetapi saya tidak mengerti yang ini. Secara khusus, saya tidak dapat menemukan kelas yang dipanggil Nullable
dalam paket java.util
. Tolong, seseorang memberi tahu saya apa artinya ini java.util.@Nullable
:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Nullable
mereka bicarakan sepertinya adajavax.annotation
, bukanjava.util
.public static <T> @Nullable java.util.Optional<T> toJavaUtil
, tetapi Java tidak membiarkan Anda menulis seperti itu?public static <T> @Nullable java.util.Optional<T> toJavaUtil
memang tidak mungkin, tetapi tidak ada alasan untuk menggunakan FQNOptional
ketika impor sudah ada.Optional
ruang lingkup di sana.@Nullable java.util.List The correct Java syntax to write an annotation on a fully-qualified type name is to put the annotation on the simple name part, as in java.util.@Nullable List. But, it’s usually better to add import java.util.List to your source file, so that you can just write @Nullable List.
Jawaban:
Baris
public static <T> java.util.@Nullable Optional<T> toJavaUtil
ditulis seperti ini, karena gaya yang biasapublic static <T> @Nullable java.util.Optional<T> toJavaUtil
tidak valid. Ini didefinisikan dalam JLS §9.7.4 :Deklarasi tipe
org.checkerframework.checker.nullness.qual@Nullable
adalah:Jadi itu berlaku untuk aturan ini.
Bahwa struktur ini tidak menghentikan eksekusi, karena paket
java.util
dan nama kelasOptional
terpecah, dapat dilihat ketika kita melihat kode yang dikompilasi menggunakanjavap -c [compiled class name]
:(
blub.Optional
adalah kelas lokal tempat saya menyalin kode Guava, untuk mendapatkan contoh minimal untuk de- / kompilasi)Seperti yang Anda lihat, anotasi tidak ada lagi di sana. Ini hanya penanda untuk kompiler untuk mencegah peringatan ketika metode mengembalikan nol (dan petunjuk untuk pembaca kode sumber), tetapi itu tidak akan dimasukkan dalam kode yang dikompilasi.
Kesalahan kompiler ini juga berlaku untuk variabel seperti:
Tetapi dapat diterima ketika anotasi tambahan mendapatkan tipe target
ElementType.FIELD
, seperti yang tertulis dalam klausa JLS yang sama:sumber
Saat menggunakan anotasi, ini adalah sintaks yang digunakan ketika Anda ingin menulis nama yang sepenuhnya memenuhi syarat untuk jenis, alih-alih menambahkan pernyataan impor.
Mengutip dari manual framework checker :
Ini juga disebutkan pada halaman 2 dari spesifikasi JSR308 yang dapat diunduh di sini . Ia mengatakan:
sumber
Agak aneh di sini adalah sintaks yang tidak biasa untuk menerapkan
ElementType.TYPE_USE
anotasi -ditargetkan. Jika Anda memeriksa dokumen Nullable , Anda akan melihat target yang tidak dikenal:Anotasi ini digunakan tepat sebelum nama sederhana dari tipe yang dianotasi, seperti pada kedua berikut ini:
Saya tidak tahu apa gunanya target semacam ini, jadi setelah membaca cepat, saya sampai ke contoh sederhana ini, yang mengambil metadata tipe kembali menggunakan anotasi yang memiliki target itu:
Dan mengolahnya menggunakan:
Saya yakin banyak kerangka kerja yang bermanfaat, seperti checkerframework, membuat penggunaan yang paling tepat
ElementType.TYPE_USE
sumber