लाइन public static <T> java.util.@Nullable Optional<T> toJavaUtilइस तरह लिखी जाती है, क्योंकि सामान्य शैली public static <T> @Nullable java.util.Optional<T> toJavaUtilअमान्य है। यह JLS This9.7.4 में परिभाषित किया गया है :
यह एक संकलित समय त्रुटि है यदि टाइप T का एनोटेशन एक प्रकार के संदर्भ में (या किसी प्रकार का कोई भाग) पर लागू होता है, और T टाइप संदर्भों में लागू होता है, और एनोटेशन स्वीकार्य नहीं है।
उदाहरण के लिए, एक एनोटेशन प्रकार टीए मानें जो मेटा-एनोटेट है @Target(ElementType.TYPE_USE)। नियम @TA java.lang.Objectऔर java.@TA lang.Objectअवैध हैं क्योंकि @TA के सबसे सरल नाम को पैकेज नाम के रूप में वर्गीकृत किया गया है। दूसरी ओर, java.lang.@TA Objectकानूनी है।
इस प्रकार की घोषणा org.checkerframework.checker.nullness.qual@Nullableहै:
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
इसलिए यह इस नियम पर लागू होता है।
यह संरचना निष्पादन को नहीं तोड़ती है, क्योंकि पैकेज java.utilऔर वर्ग का नाम Optionalविभाजित किया गया था, जब हम संकलित कोड का उपयोग करके देख सकते हैं 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.Optionalएक स्थानीय वर्ग है जहाँ मैंने अमरूद कोड की प्रतिलिपि बनाई है, ताकि डी- / संकलन के लिए एक न्यूनतम उदाहरण प्राप्त किया जा सके)
जैसा कि आप देख सकते हैं, एनोटेशन अब वहां मौजूद नहीं है। कंपाइलर के लिए यह चेतावनी को रोकने के लिए केवल एक मार्कर है जब विधि अशक्त (और स्रोत कोड पाठकों के लिए एक संकेत) देता है, लेकिन इसे संकलित कोड में शामिल नहीं किया जाएगा।
यह संकलक त्रुटि भी चर जैसे लागू होती है:
private @Nullable2 java.util.Optional<?> o;
लेकिन स्वीकार्य हो सकता है जब एनोटेशन अतिरिक्त ElementType.FIELDरूप से लक्ष्य प्रकार प्राप्त करता है , जैसा कि एक ही जेएलएस क्लॉज में लिखा गया है:
यदि TA के साथ अतिरिक्त रूप से मेटा-एनोटेट किया गया है @Target(ElementType.FIELD), तो यह शब्द @TA java.lang.Objectउन स्थानों पर कानूनी है, जो घोषणा और प्रकार दोनों संदर्भ हैं, जैसे कि फ़ील्ड घोषणा @TA java.lang.Object f;। यहाँ, @TA को f (और java.lang.Object प्रकार पर नहीं) के घोषणापत्र पर लागू माना जाता है क्योंकि टीए क्षेत्र घोषणा संदर्भ में लागू होता है।
Nullableवे बात कर रहे हैं के बारे में वहाँ में हो रहा हैjavax.annotation, नहींjava.util।