আমার মধ্যে <Foo>
এবং এর মধ্যে পার্থক্য সম্পর্কে একটি ভুল ধারণা রয়েছে বলে মনে হচ্ছে <? extends Foo>
। আমার বোধ থেকে, যদি আমাদের ছিল
ArrayList<Foo> foos = new ArrayList<>();
এটি নির্দেশ করে যে প্রকারের অবজেক্টগুলি Foo
এই অ্যারে তালিকায় যুক্ত হতে পারে। এর উপশ্রেণী যেহেতু Foo
এছাড়াও ধরনের হয় Foo
, তারা একটি ত্রুটি ছাড়া, যেমন দ্বারা চিত্রিত যোগ করা যেতে পারে
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Bar());
যেখানে Bar extends Foo
।
এখন, আমি foos
হিসাবে সংজ্ঞা ছিল বলে
ArrayList<? extends Foo> foos = new ArrayList<>();
আমার বর্তমান বোঝাপড়া এটি প্রকাশ করে some unknown type that extends Foo
। আমি এটি বোঝাতে চাইছি যে যে কোনও অবজেক্টের একটি সাবক্লাস Foo
এই তালিকাতে যুক্ত করা যেতে পারে; মানে যে ArrayList<Foo>
এবং এর মধ্যে কোনও পার্থক্য নেই ArrayList<? extends Foo>
।
এটি পরীক্ষা করতে, আমি নিম্নলিখিত কোডটি লেখার চেষ্টা করেছি
ArrayList<? extends Foo> subFoos = new ArrayList<>();
subFoos.add(new Foo());
subFoos.add(new Bar());
তবে নিম্নলিখিত সংকলন ত্রুটির সাথে অনুরোধ জানানো হয়েছিল
no suitable method found for add(Foo)
method java.util.Collection.add(capture#1 of ? extends Foo) is not applicable
(argument mismatch; Foo cannot be converted to capture#1 of ? extends Foo)
no suitable method found for add(Bar)
method java.util.Collection.add(capture#2 of ? extends Bar) is not applicable
(argument mismatch; Bar cannot be converted to capture#2 of ? extends Bar)
আমার বর্তমান বোঝাপড়ার উপর ভিত্তি করে, আমি দেখতে পাচ্ছি কেন আমি কেন Foo
একটি তালিকায় একটি যুক্ত করতে সক্ষম না হতে পারি <? extends Foo>
, কারণ এটি নিজেই একটি সাবক্লাস নয়; তবে কেন আমি Bar
তালিকায় কোনও যুক্ত করতে পারি না তা সম্পর্কে আমি আগ্রহী ।
আমার বোঝার গর্ত কোথায়?
<? extends Foo>
একটি নির্দিষ্ট এবং অজানা শ্রেণি যা প্রসারিত Foo
। এই শ্রেণীর সাথে একটি ক্রিয়াকলাপ কেবল তখনই বৈধ যখন এটি কোনও সাবক্লাসের জন্য আইনী হবে Foo
।