জাভাতে জেনেরিক ওয়াইল্ডকার্ড সম্পর্কে আমার কয়েকটি প্রশ্ন রয়েছে:
মধ্যে পার্থক্য কি
List<? extends T>
এবংList<? super T>
?বাউন্ডেড ওয়াইল্ডকার্ড কী এবং আনবাউন্ডেড ওয়াইল্ডকার্ড কী?
জাভাতে জেনেরিক ওয়াইল্ডকার্ড সম্পর্কে আমার কয়েকটি প্রশ্ন রয়েছে:
মধ্যে পার্থক্য কি List<? extends T>
এবং List<? super T>
?
বাউন্ডেড ওয়াইল্ডকার্ড কী এবং আনবাউন্ডেড ওয়াইল্ডকার্ড কী?
উত্তর:
আপনার প্রথম প্রশ্নে <? extends T>
এবং <? super T>
সীমাবদ্ধ ওয়াইল্ডকার্ডের উদাহরণ। একটি আনবাউন্ডেড ওয়াইল্ডকার্ড দেখতে দেখতে <?>
এবং মূলত এর অর্থ <? extends Object>
। এটি আলগাভাবে অর্থ জেনেরিক যে কোনও ধরণের হতে পারে। একটি বাউন্ডেড ওয়াইল্ডকার্ড ( <? extends T>
বা <? super T>
) প্রকারের উপরে এই বলে বাধা দেয় যে এটি হয় নির্দিষ্ট ধরণের প্রসারিত করতে হয় ( <? extends T>
উপরের বাউন্ড হিসাবে পরিচিত) বা নির্দিষ্ট ধরণের পূর্বপুরুষ হতে হবে ( <? super T>
এটি একটি নিম্ন সীমানা হিসাবে পরিচিত) ।
জাভা টিউটোরিয়ালের ওয়াইল্ডকার্ডস এবং ওয়াইল্ডকার্ডের সাথে আরও মজাদার নিবন্ধগুলিতে জেনেরিকগুলির বেশ কিছু সুন্দর ব্যাখ্যা রয়েছে ।
<? super C>
অর্থ হ'ল আপনার ধরণটি C
শ্রেণিবদ্ধের উপরের কিছুতে সীমাবদ্ধ । (। দুঃখিত অত্যন্ত দেরী উত্তর দেওয়ার জন্য আমি মনে করি আমরা মন্তব্য বিজ্ঞপ্তিগুলি 2 বছর আগে ছিল না?)
আপনার যদি শ্রেণি শ্রেণিবিন্যাস 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>
বর্ণনা যেমন তালিকা যে ধরনের বর্গ বি অভিভাবক ক্লাস হয় গ্রহণ ? কোন কারণেই সি এবং ডি হুম সংকলন করবে না?
জোশ ব্লচেরও কখন ব্যবহার করতে হবে super
এবং extends
এই গুগল আইও ভিডিও আলোচনায় যেখানে তিনি প্রযোজক extends
গ্রাহকsuper
স্মৃতিচারণের উল্লেখ করেছেন তার একটি ভাল ব্যাখ্যা রয়েছে ।
উপস্থাপনা স্লাইডগুলি থেকে:
ধরুন আপনি এতে বাল্ক পদ্ধতি যুক্ত করতে চান
Stack<E>
void pushAll(Collection<? extends E> src);
- এসআরসি একটি ই প্রযোজক
void popAll(Collection<? super E> dst);
- ডিএসটি একটি ই গ্রাহক
এমন সময় থাকতে পারে যখন আপনি কোনও ধরণের প্যারামিটারে যাওয়ার অনুমতিপ্রাপ্ত প্রকারের সীমাবদ্ধ করতে চান want উদাহরণস্বরূপ, একটি পদ্ধতি যা সংখ্যার উপর পরিচালিত হয় কেবলমাত্র সংখ্যার উদাহরণ বা এর উপক্লাসগুলি গ্রহণ করতে পারে। এটিই সীমাবদ্ধ ধরণের পরামিতিগুলির জন্য।
Collection<? extends MyObject>
মানে এটা সব বস্তু আছে গ্রহণ করতে পারে যা- একটি MyObject সঙ্গে সম্পর্ক (অর্থাত কোনো বস্তুর myObject হল এক ধরনের অথবা আমরা MyObject কোন উপশ্রেণী কোন বস্তুর বলতে পারেন) অথবা MyObject বর্গ একটি অবজেক্ট।
উদাহরণ স্বরূপ:
class MyObject {}
class YourObject extends MyObject{}
class OurObject extends MyObject{}
তারপর,
Collection<? extends MyObject> myObject;
কেবল মাইওবজেক্ট বা মাইবজেক্টের বাচ্চারা গ্রহণ করবে (যেমন আমাদের ওবজেক্ট বা আপনারঅজেক্ট বা মাইবজেক্ট টাইপের কোনও বস্তু, তবে মাইওজেক্টের সুপারক্লাসের কোনও বস্তু নয়)।
সাধারণভাবে,
যদি কোনও কাঠামোতে এক ধরণের ফর্মযুক্ত উপাদান থাকে
? 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));
}
}
জেনেরিক ওয়াইল্ডকার্ডগুলি এমন পদ্ধতি তৈরি করতে তৈরি করা হয়েছে যা সংগ্রহকে পরিচালনা করে পুনরায় ব্যবহারযোগ্য।
উদাহরণস্বরূপ, যদি কোনও পদ্ধতির একটি প্যারামিটার থাকে তবে List<A>
আমরা কেবল List<A>
এই পদ্ধতিতে দিতে পারি । এটি কিছু পরিস্থিতিতে এই পদ্ধতির বিনোদনের জন্য অপচয় :
List<A>
, তবে আমাদের List<A-sub>
এই পদ্ধতিতে দেওয়ার অনুমতি দেওয়া উচিত । (কারণ এ-সাব আইএস একটি এ)List<A>
, তবে আমাদের List<A-super>
এই পদ্ধতিতে দেওয়ার অনুমতি দেওয়া উচিত । (কারণ এ হ'ল একটি সুপার)