এটি একটি তৃতীয় পক্ষের লাইব্রেরি এপিআইয়ের বাস্তব-বিশ্বের উদাহরণ, তবে সরলীকৃত।
ওরাকল জেডিকে 8u72 দিয়ে সংকলিত
এই দুটি পদ্ধতি বিবেচনা করুন:
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
উভয়ই "চেক না করা castালাই" সতর্কতার প্রতিবেদন করে - আমি কেন পাই। যে বিষয়টি আমাকে বিভ্রান্ত করে তা হ'ল আমি কেন ফোন করতে পারি
Integer x = getCharSequence();
এবং এটি সংকলন? সংকলকটি জানতে হবে যা Integer
বাস্তবায়ন করে না CharSequence
। কল
Integer y = getString();
একটি ত্রুটি দেয় (যেমন প্রত্যাশিত)
incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
কেউ ব্যাখ্যা করতে পারেন কেন এই আচরণটি বৈধ হিসাবে বিবেচিত হবে? এটা কিভাবে দরকারী হবে?
ক্লায়েন্ট জানেন না যে এই কলটি অনিরাপদ - ক্লায়েন্টের কোডটি সতর্কতা ছাড়াই সংকলন করে। সংকলন কেন সে সম্পর্কে সতর্ক করবে না / ত্রুটি জারি করবে?
এছাড়াও, এই উদাহরণ থেকে এটি কীভাবে আলাদা:
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // error
পাস করার চেষ্টা List<Integer>
একটি প্রত্যাশা হিসাবে ত্রুটি দেয়:
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
যদি এটি ত্রুটি হিসাবে প্রতিবেদন করা Integer x = getCharSequence();
হয় তবে কেন নয়?
Integer x = getCharSequence();
সংকলন করবে, তবে আরএইচএসেInteger x = (Integer) getCharSequence();