জাভা জেনারিক্স (ওয়াইল্ডকার্ডস)


109

জাভাতে জেনেরিক ওয়াইল্ডকার্ড সম্পর্কে আমার কয়েকটি প্রশ্ন রয়েছে:

  1. মধ্যে পার্থক্য কি List<? extends T>এবং List<? super T>?

  2. বাউন্ডেড ওয়াইল্ডকার্ড কী এবং আনবাউন্ডেড ওয়াইল্ডকার্ড কী?


কেস যে টেড গাও এর উত্তর মুছে ফেলা হয় (এটা লিংক শুধুমাত্র ছিল যেহেতু), এখানে ব্লগ পোস্টে যা এটি সংযুক্ত।
রোহউই

উত্তর:


123

আপনার প্রথম প্রশ্নে <? extends T>এবং <? super T>সীমাবদ্ধ ওয়াইল্ডকার্ডের উদাহরণ। একটি আনবাউন্ডেড ওয়াইল্ডকার্ড দেখতে দেখতে <?>এবং মূলত এর অর্থ <? extends Object>। এটি আলগাভাবে অর্থ জেনেরিক যে কোনও ধরণের হতে পারে। একটি বাউন্ডেড ওয়াইল্ডকার্ড ( <? extends T>বা <? super T>) প্রকারের উপরে এই বলে বাধা দেয় যে এটি হয় নির্দিষ্ট ধরণের প্রসারিত করতে হয় ( <? extends T>উপরের বাউন্ড হিসাবে পরিচিত) বা নির্দিষ্ট ধরণের পূর্বপুরুষ হতে হবে ( <? super T>এটি একটি নিম্ন সীমানা হিসাবে পরিচিত) ।

জাভা টিউটোরিয়ালের ওয়াইল্ডকার্ডস এবং ওয়াইল্ডকার্ডের সাথে আরও মজাদার নিবন্ধগুলিতে জেনেরিকগুলির বেশ কিছু সুন্দর ব্যাখ্যা রয়েছে ।


ঠিক এটি সঠিকভাবে পেতে, যদি A <বি এবং বি <সি হয় তবে: <এ প্রসারিত সি> ভুল?
পাবলো ফার্নান্দেজ

যদি A <বি দ্বারা, আপনার মানে A এর বি প্রসারিত হয়, তবে A এর সি প্রসারিত হবে আপনি কি ওয়াইল্ডকার্ড সিনট্যাক্সে এটি ব্যবহার করবেন না, আপনি বলবেন <? আপনার পছন্দগুলি এ বা বি এর মধ্যে সীমাবদ্ধ করতে সি> প্রসারিত করুন
বিল করুন

এবং সেই ক্ষেত্রে যদি আমি <বলি? সুপার সি> পার্থক্য কি হবে?
পাবলো ফার্নান্দেজ

3
: শুধু জাভা জেনেরিক্স আরেকটি রেফারেন্স সুপারিশ করতে চেয়েছিলেন angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
জ্যাক Scrivena

3
@ পাবলো: এর <? super C>অর্থ হ'ল আপনার ধরণটি Cশ্রেণিবদ্ধের উপরের কিছুতে সীমাবদ্ধ । (। দুঃখিত অত্যন্ত দেরী উত্তর দেওয়ার জন্য আমি মনে করি আমরা মন্তব্য বিজ্ঞপ্তিগুলি 2 বছর আগে ছিল না?)
টিকটিকি বিল

49

আপনার যদি শ্রেণি শ্রেণিবিন্যাস A থাকে, বি A এর একটি উপক্লাস এবং সি এবং ডি উভয়ই নীচের মতো বি এর উপক্লাস হয়

class A {}
class B extends A {}
class C extends B {}
class D extends B {}

তারপর

List<? extends A> la;
la = new ArrayList<B>();
la = new ArrayList<C>();
la = new ArrayList<D>();

List<? super B> lb;
lb = new ArrayList<A>(); //fine
lb = new ArrayList<C>(); //will not compile

public void someMethod(List<? extends B> lb) {
    B b = lb.get(0); // is fine
    lb.add(new C()); //will not compile as we do not know the type of the list, only that it is bounded above by B
}

public void otherMethod(List<? super B> lb) {
    B b = lb.get(0); // will not compile as we do not know whether the list is of type B, it may be a List<A> and only contain instances of A
    lb.add(new B()); // is fine, as we know that it will be a super type of A 
}

একটি বাউন্ডেড ওয়াইল্ডকার্ড ? extends Bযেখানে বি কিছু ধরণের হয়। এটি, প্রকারটি অজানা তবে এটিতে একটি "আবদ্ধ" স্থাপন করা যেতে পারে। এই ক্ষেত্রে, এটি কিছু শ্রেণি দ্বারা আবদ্ধ, যা বি এর একটি সাবক্লাস is


আমি অনুমান List<? super B>বর্ণনা যেমন তালিকা যে ধরনের বর্গ বি অভিভাবক ক্লাস হয় গ্রহণ ? কোন কারণেই সি এবং ডি হুম সংকলন করবে না?
ভোলকান গাভেন

38

জোশ ব্লচেরও কখন ব্যবহার করতে হবে superএবং extendsএই গুগল আইও ভিডিও আলোচনায় যেখানে তিনি প্রযোজক extendsগ্রাহকsuper স্মৃতিচারণের উল্লেখ করেছেন তার একটি ভাল ব্যাখ্যা রয়েছে ।

উপস্থাপনা স্লাইডগুলি থেকে:

ধরুন আপনি এতে বাল্ক পদ্ধতি যুক্ত করতে চান Stack<E>

void pushAll(Collection<? extends E> src);

- এসআরসি একটি ই প্রযোজক

void popAll(Collection<? super E> dst);

- ডিএসটি একটি ই গ্রাহক


আমি ব্লচের বইটি পড়েছি, তবে আমি এখনও এই বিশেষ ক্ষেত্রে প্রসার এবং সুপারের মধ্যে পার্থক্য দেখতে পাচ্ছি না।
পাবলো ফার্নান্দেজ

ভিডিওটি দেখুন, আমি মনে করি এটি বেশ পরিষ্কার। এছাড়াও, আমি মনে করি আপনার এই "লিস্ট <? প্রসারিত টি> এবং তালিকা <? সুপার টি>" এর মধ্যে পার্থক্য কী এই বিষয়ে আরও একটি প্রশ্ন জিজ্ঞাসা করা উচিত যেখানে আপনি আশাবাদী আরও উত্তর পাবেন। (যদি আপনি করেন তবে এখান থেকে একটি লিঙ্ক যুক্ত করুন)
ফাঁকা

2
শয্যা - এটি সম্পূর্ণরূপে তৈরি করতে এবং একা দাঁড়িয়ে থাকার জন্য কেন এই উত্তরে উদাহরণ অন্তর্ভুক্ত করবেন না। লিঙ্কগুলি সাময়িকের হয়।
জেমস শেক

3

এমন সময় থাকতে পারে যখন আপনি কোনও ধরণের প্যারামিটারে যাওয়ার অনুমতিপ্রাপ্ত প্রকারের সীমাবদ্ধ করতে চান want উদাহরণস্বরূপ, একটি পদ্ধতি যা সংখ্যার উপর পরিচালিত হয় কেবলমাত্র সংখ্যার উদাহরণ বা এর উপক্লাসগুলি গ্রহণ করতে পারে। এটিই সীমাবদ্ধ ধরণের পরামিতিগুলির জন্য।

Collection<? extends MyObject> 

মানে এটা সব বস্তু আছে গ্রহণ করতে পারে যা- একটি MyObject সঙ্গে সম্পর্ক (অর্থাত কোনো বস্তুর myObject হল এক ধরনের অথবা আমরা MyObject কোন উপশ্রেণী কোন বস্তুর বলতে পারেন) অথবা MyObject বর্গ একটি অবজেক্ট।

উদাহরণ স্বরূপ:

class MyObject {}

class YourObject extends MyObject{}

class OurObject extends MyObject{}

তারপর,

Collection<? extends MyObject> myObject; 

কেবল মাইওবজেক্ট বা মাইবজেক্টের বাচ্চারা গ্রহণ করবে (যেমন আমাদের ওবজেক্ট বা আপনারঅজেক্ট বা মাইবজেক্ট টাইপের কোনও বস্তু, তবে মাইওজেক্টের সুপারক্লাসের কোনও বস্তু নয়)।


1

সাধারণভাবে,

যদি কোনও কাঠামোতে এক ধরণের ফর্মযুক্ত উপাদান থাকে ? extends Eতবে আমরা কাঠামোর বাইরে উপাদানগুলি পেতে পারি, তবে আমরা উপাদানগুলিকে কাঠামোর মধ্যে রাখতে পারি না

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints;
nums.add(3.14); // compile-time error
assert ints.toString().equals("[1, 2, 3.14]"); 

কাঠামোতে উপাদান আনার জন্য আমাদের আরেক ধরণের ওয়াইল্ডকার্ড প্রয়োজন Wildcards with super,

 List<Object> objs = Arrays.<Object>asList(2, 3.14, "four");
    List<Integer> ints = Arrays.asList(5, 6);
    Collections.copy(objs, ints);
    assert objs.toString().equals("[5, 6, four]");

    public static <T> void copy(List<? super T> dst, List<? extends T> src) {
          for (int i = 0; i < src.size(); i++) {
                dst.set(i, src.get(i));
         }
    }

1

জেনেরিক ওয়াইল্ডকার্ডগুলি এমন পদ্ধতি তৈরি করতে তৈরি করা হয়েছে যা সংগ্রহকে পরিচালনা করে পুনরায় ব্যবহারযোগ্য।

উদাহরণস্বরূপ, যদি কোনও পদ্ধতির একটি প্যারামিটার থাকে তবে List<A>আমরা কেবল List<A>এই পদ্ধতিতে দিতে পারি । এটি কিছু পরিস্থিতিতে এই পদ্ধতির বিনোদনের জন্য অপচয় :

  1. যদি এই পদ্ধতিটি কেবলমাত্র বস্তুগুলি থেকে পড়ে List<A>, তবে আমাদের List<A-sub>এই পদ্ধতিতে দেওয়ার অনুমতি দেওয়া উচিত । (কারণ এ-সাব আইএস একটি এ)
  2. যদি এই পদ্ধতিতে কেবলমাত্র বস্তু সন্নিবেশ করানো হয় List<A>, তবে আমাদের List<A-super>এই পদ্ধতিতে দেওয়ার অনুমতি দেওয়া উচিত । (কারণ এ হ'ল একটি সুপার)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.