Çizgi public static <T> java.util.@Nullable Optional<T> toJavaUtilböyle yazılır, çünkü normal stil public static <T> @Nullable java.util.Optional<T> toJavaUtilgeçersiz. Bu JLS §9.7.4'te tanımlanmıştır :
T türünde bir ek açıklama, bir tür bağlamında bir türe (veya bir türün herhangi bir bölümüne) uygulanırsa ve T, tür bağlamlarında uygulanabilirse ve ek açıklamaya izin verilmezse derleme zamanı hatasıdır.
Örneğin, sadece meta açıklamalı bir açıklama türü TA olduğunu varsayalım @Target(ElementType.TYPE_USE). Terimler yasadışıdır @TA java.lang.Objectve java.@TA lang.Object@TA'nın en yakın olduğu basit ad bir paket adı olarak sınıflandırılır. Diğer yandan java.lang.@TA Objectyasaldır.
Tür bildirimi org.checkerframework.checker.nullness.qual@Nullable:
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
Yani bu kurala uygulanıyor.
Paket java.utilve sınıf adı Optionalbölündüğünden, bu yapının yürütmeyi bozmaması derlenmiş koda baktığımızda görülebilir javap -c [compiled class name]:
class just.a.test.Main {
just.a.test.Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static <T> java.util.Optional<T> toJavaUtil(blub.Optional<T>);
Code:
0: aload_0
1: ifnonnull 8
4: aconst_null
5: goto 12
8: aload_0
9: invokevirtual #2 // Method blub/Optional.toJavaUtil:()Ljava/util/Optional;
12: areturn
}
( blub.OptionalDe- / derlemek için minimal bir örnek almak için Guava kodunu kopyaladığım yerel bir sınıftır)
Gördüğünüz gibi, ek açıklama artık mevcut değil. Derleyici için, yöntem null döndürdüğünde (ve kaynak kodu okuyucular için bir ipucu) bir uyarıyı önlemek için yalnızca bir işaretleyicidir, ancak derlenmiş koda dahil edilmeyecektir.
Bu derleyici hatası aşağıdaki gibi değişkenler için de geçerlidir:
private @Nullable2 java.util.Optional<?> o;
Ancak, ek açıklama ElementType.FIELDaynı JLS yan tümcesinde yazıldığı gibi ek olarak hedef türü aldığında kabul edilebilir olabilir :
TA ek olarak meta açıklamalı olarak eklenmişse @Target(ElementType.FIELD), bu terim @TA java.lang.Objecthem alan bildirimi hem de alan bildirimi gibi tür bağlamları olan konumlarda yasaldır @TA java.lang.Object f;. Burada, ta alan bildirimi bağlamında TA uygulanabilir olduğundan, @TA f bildirimine (java.lang.Object türüne değil) uygulanacaktır.
Nullableİçinde var gibi görünüyor hakkında onlar konuşuyorlarjavax.annotationdeğiljava.util.