<এর মধ্যে পার্থক্য কী? ফু> এবং <ফু> প্রসারিত করে


20

আমার মধ্যে <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তালিকায় কোনও যুক্ত করতে পারি না তা সম্পর্কে আমি আগ্রহী ।

আমার বোঝার গর্ত কোথায়?



1
<? extends Foo>একটি নির্দিষ্ট এবং অজানা শ্রেণি যা প্রসারিত Foo। এই শ্রেণীর সাথে একটি ক্রিয়াকলাপ কেবল তখনই বৈধ যখন এটি কোনও সাবক্লাসের জন্য আইনী হবে Foo
সাধারণ

3
কি দারুন. জাভার জেনেরিকগুলি সম্পর্কে আপনি যত বেশি শিখবেন ততই তাত্পর্যপূর্ণ।
ম্যাসন হুইলারের

উত্তর:


15

আপনি নিজের দ্বারা আবিষ্কার করেছেন ArrayListযে হিসাবে ঘোষিতটি ArrayList<? extends Foo> subFoos = new ArrayList<>();খুব কার্যকর হবে না।

এটি বিবেচনা করার দরকারীতা দেখতে <? extends T>:

List<Foo> collect( List<? extends Foo> a1, List<? extends Foo> a2 )
{
    List<Foo> collected = new ArrayList<>();
    collected.addAll( a1 );
    collected.addAll( a2 );
    return collected;
}

যা পরে নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

List<Foo> foos = collect( new ArrayList<Foo>(), new ArrayList<Bar>() );

বা নিম্নলিখিত হিসাবে:

List<Foo> foos = collect( new ArrayList<Bar>(), new ArrayList<Foo>() );

নোট করুন যে collectপদ্ধতিটি নিম্নলিখিত হিসাবে ঘোষণা করা হত যদি উপরেরগুলির মধ্যে কেউ কাজ করত না :

List<Foo> collect( List<Foo> a1, List<Foo> a2 )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.