লাইনটি public static <T> java.util.@Nullable Optional<T> toJavaUtilএভাবে লেখা হয়, কারণ সাধারণ স্টাইলটি public static <T> @Nullable java.util.Optional<T> toJavaUtilঅবৈধ। এটি জেএলএস -9.7.4 এ সংজ্ঞায়িত করা হয়েছে :
এটি টাইপ টি-এর একটি টীকা প্রকারের প্রসঙ্গে একটি প্রকারের (বা কোনও ধরণের কোনও অংশ) ক্ষেত্রে প্রযোজ্য এবং এটি টাইপ প্রসঙ্গে প্রযোজ্য, এবং টীকাটি গ্রহণযোগ্য নয়।
উদাহরণস্বরূপ, এনোটেশন টাইপ টিএ ধরে নিন যা কেবলমাত্র মেটা-টীকাযুক্ত @Target(ElementType.TYPE_USE)। শর্তাদি @TA java.lang.Objectএবং java.@TA lang.Objectঅবৈধ কারণ @ টিটিএর নিকটতম সরল নামটি প্যাকেজের নাম হিসাবে শ্রেণিবদ্ধ করা হয়েছে। অন্যদিকে, 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একই জেএলএস ধারাতে লিখিত হিসাবে টিকাটি অতিরিক্তভাবে লক্ষ্য প্রকারটি পায় তখন গ্রহণযোগ্য হয়ে উঠতে পারে :
যদি টিএ অতিরিক্তভাবে মেটা-টীকাযুক্ত হয় @Target(ElementType.FIELD)তবে শব্দটি @TA java.lang.Objectএমন জায়গাগুলিতে আইনী যা উভয় ঘোষণা এবং টাইপ প্রসঙ্গ যেমন ক্ষেত্রের ঘোষণার মতো @TA java.lang.Object f;। এখানে, টিটিএ f এর ঘোষণাপত্রের (এবং জাভা.লাং.অবজেক্ট টাইপের ক্ষেত্রে নয়) প্রযোজ্য বলে মনে করা হচ্ছে কারণ ক্ষেত্রের ঘোষণার প্রসঙ্গে টিএ প্রযোজ্য।
Nullableতারা কথা বলছি সম্পর্কে সেখানে হবে বলে মনে হয়javax.annotationনাjava.util।