জাভা জেনেরিকের টাইপ প্যারামিটারে প্রশ্ন চিহ্নটির অর্থ কী?


216

এটি স্ট্যানফোর্ড পার্সারের সাথে থাকা কয়েকটি উদাহরণ থেকে নেওয়া কোডের একটি ছোট স্নিপেট et আমি জাভাতে প্রায় 4 বছর ধরে বিকাশ করছি, তবে এই স্টাইলের কোডটি কী বোঝাতে চাইছে তা সম্পর্কে খুব দৃ strong় ধারণা কখনও পাইনি।

List<? extends HasWord> wordList = toke.tokenize();

আমি কোডের বিশদ সম্পর্কে উদ্বিগ্ন নই। আমি যা সম্পর্কে বিভ্রান্ত তা হ'ল ইংরেজিতে জেনেরিক ভাবটি ঠিক কী প্রকাশ করা উচিত।

কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে?


উত্তর:


226
? extends HasWord

মানে "একটি শ্রেণি / ইন্টারফেস যা প্রসারিত হয় HasWord।" অন্য কথায়, HasWordনিজে বা তার যে কোনও শিশু ... মূলত এমন কিছু যা instanceof HasWordপ্লাস দিয়ে কাজ করবে null

আরও প্রযুক্তিগত ভাষায়, ? extends HasWordএকটি সীমাবদ্ধ ওয়াইল্ডকার্ড, কার্যকর জাভা তৃতীয় সংস্করণের আইটেম 31-এ আচ্ছাদিত , যা ১৩৯ পৃষ্ঠায় শুরু হয়েছে the দ্বিতীয় সংস্করণের একই অধ্যায়টি পিডিএফ হিসাবে অনলাইনে উপলব্ধ ; সীমানা ওয়াইল্ডকার্ডের অংশটি আইটেম 28 পৃষ্ঠা থেকে শুরু হওয়া 134 page

আপডেট: পিডিএফ লিঙ্কটি আপডেট হয়েছিল যেহেতু ওরাকল কিছুক্ষণ আগে এটিকে সরিয়েছে। এটি এখন লন্ডনের স্কুল অফ ইলেক্ট্রনিক ইঞ্জিনিয়ারিং এবং কম্পিউটার সায়েন্সের কুইন মেরি বিশ্ববিদ্যালয় দ্বারা আয়োজিত অনুলিপিটির দিকে ইঙ্গিত করে।

আপডেট 2: আপনি কেন ওয়াইল্ডকার্ড ব্যবহার করতে চান তা আরও কিছু বিশদে যেতে দিন।

আপনি যদি একটি পদ্ধতি যার স্বাক্ষর ঘোষণা তাহলে আশা আপনি পাস List<HasWord>, তারপর একমাত্র জিনিস আপনি পাস করতে পারেন একটি হল List<HasWord>

তবে, যদি স্বাক্ষরটি বলা হয় List<? extends HasWord>তবে আপনি তার List<ChildOfHasWord>পরিবর্তে পাস করতে পারেন ।

মনে রাখবেন যে List<? extends HasWord>এবং এর মধ্যে একটি সূক্ষ্ম পার্থক্য রয়েছে List<? super HasWord>। জোশুয়া ব্লচ যেমন লিখেছেন: পিইসিএস = প্রযোজক-প্রসারিত, ভোক্তা-সুপার।

এর অর্থ হ'ল যদি আপনি কোনও সংগ্রহটিতে যাচ্ছেন যা আপনার পদ্ধতিটি ডেটা টেনে আনে (যেমন সংগ্রহটি আপনার পদ্ধতির ব্যবহারের জন্য উপাদান তৈরি করছে), আপনার ব্যবহার করা উচিত extends। যদি আপনি কোনও সংগ্রহটিতে যাচ্ছেন যা আপনার পদ্ধতিতে ডেটা যুক্ত করে (যেমন সংগ্রহটি আপনার পদ্ধতি তৈরির উপাদানগুলি গ্রাস করছে), এটি ব্যবহার করা উচিত super

এটি বিভ্রান্তিকর লাগতে পারে। যাইহোক, যদি আপনি এটা দেখতে পারেন Listএর sortকমান্ড (যা Collections.sort দুই-ARG সংস্করণে মাত্র একটি শর্টকাট)। পরিবর্তে এটি গ্রহণ করার পরিবর্তে Comparator<T>এটি গ্রহণ করে Comparator<? super T>। এই ক্ষেত্রে, Listতুলনাকারী তালিকাটি নিজেই পুনরায় অর্ডার করার জন্য উপাদানগুলির উপাদানগুলি গ্রাস করছে।


17
"উদাহরণস্বরূপ যে কোনও কিছু কাজ করবে" - এর সাথে নাল মান। মনে রাখবেন যে নাল মানগুলি কোনও পরীক্ষার জন্য মিথ্যা করে false
আইয়াল স্নাইডার

12
ইন্টারফেস ভুলবেন না। দ্য ? কোন শ্রেণির প্রতিনিধিত্ব করতে হবে না!
মার্ক পিটারস

9
List<HasWord>আপনি যা বর্ণনা করেছেন ঠিক তা হ'ল: একটি তালিকা যার মধ্যে এমন কোনও অবজেক্ট রয়েছে xযার জন্য x instanceof HasWordসত্য ফিরে আসে এবং null। এর জন্য আপনার কোনও ওয়াইল্ডকার্ডের দরকার নেই। ওয়াইল্ডকার্ডের অর্থ হ'ল এটি প্রকৃতপক্ষে অন্য ধরণের একটি তালিকা হতে পারে, যতক্ষণ না এই ধরণের একটি সাব টাইপ হয় HasWord। (দেরী মন্তব্যের জন্য দুঃখিত।)
পাওলো ইবারম্যান

1
পিডিএফ লিঙ্কটি কাজ করছে বলে মনে হচ্ছে না, তবে এটি আমার পক্ষে দরকারী ছিল: ডকস.অরাকল.com
tutorial

এটি অদ্ভুত, গত বছর আমি কখনই একটি বার্তা পেলাম না যখন @ ইউজার 1338062 পোস্ট করেছে এবং পিডিএফ লিঙ্কটি কাজ করছে না তা জানতাম না। এখনই স্থির। আমি নিজেও বইটির একটি লিঙ্ক যুক্ত করেছি।
পাওয়ারলর্ড

65

একটি প্রশ্ন চিহ্ন 'কোনও প্রকারের' জন্য একটি স্বাক্ষরকারী। ?একা মানে

যে কোনও প্রকার প্রসারিত Object(সহ Object)

আপনার উদাহরণের উপরের মানে যখন

যে কোনও প্রকারের প্রসার বা বাস্তবায়ন HasWord( HasWordযদি HasWordএটি একটি অ-বিমূর্ত শ্রেণীর অন্তর্ভুক্ত থাকে তবে)


2
তাহলে কি public Set<Class<?>> getClasses()মানে? এর সাথে পার্থক্য কী Set<Class>? আমি অপেক্ষায় থাকবো javax.ws.rs.core.Application
ভল্ট

14

List<? extends HasWord>হাসওয়ার্ড প্রসারিত যে কোনও কংক্রিট শ্রেণি গ্রহণ করে। আপনার যদি নিম্নলিখিত ক্লাস থাকে ...

public class A extends HasWord { .. }
public class B extends HasWord { .. }
public class C { .. }
public class D extends SomeOtherWord { .. }

... wordListকেবলমাত্র দুটি হিসাবে উভয় শ্রেণীর ক্ষেত্রে একই পিতা বা null(যা উদাহরণস্বরূপ চেক ব্যর্থ হয় HasWorld) বা উভয়ের মিশ্রণ হিসাবে উভয়ের মিশ্রণ হিসাবে বা বিএস বা উভয়ের মিশ্রণের তালিকা থাকতে পারে ।


8
শুধু কংক্রিট নয়, বিমূর্ত সাবক্লাসগুলিও।
bloparod

2
শুধু কংক্রিট এবং বিমূর্ত উপশ্রেণী, কিন্তু উপ-ইন্টারফেসগুলি: List<? extends Collection<String>> list = new ArrayList<List<String>>();
মার্ক পিটারস

2
আপনার এর জন্য ওয়াইল্ডকার্ডের দরকার List<HasWord>নেই , আসলে: এর জন্য ঠিক তেমনটিও করে। এখানে বক্তব্যটি হ'ল এই ভেরিয়েবলটিতে একটি List<A>বা List<B>পাশাপাশি a থাকতে পারে List<HasWord>
পাওলো ইবারম্যান

12

সম্ভবত একটি অনুমোদিত "বাস্তব জগত" উদাহরণ সাহায্য করবে।

আমার কাজের জায়গাতে আমাদের আবর্জনা বিন রয়েছে যা বিভিন্ন স্বাদে আসে v সমস্ত পাত্রে আবর্জনা রয়েছে তবে কয়েকটি বিন বাকী বিশেষজ্ঞ এবং সব ধরণের আবর্জনা গ্রহণ করেন না। সুতরাং আমাদের আছে Bin<CupRubbish>এবং Bin<RecylcableRubbish>। টাইপ সিস্টেমে নিশ্চিত হওয়া দরকার যে আমি HalfEatenSandwichRubbishএই ধরণের কোনওটিতেই প্রবেশ করতে পারি না, তবে এটি একটি সাধারণ আবর্জনার বাক্সে যেতে পারে Bin<Rubbish>। যদি আমি একটি বিষয়ে কথা বলতে চেয়েছিলেন Binএর Rubbishযা আমি বেমানান আবর্জনা রাখা না পারেন, বিশেষ করা হতে পারে, তাহলে সেই হবে Bin<? extends Rubbish>

(দ্রষ্টব্য: ? extendsকেবলমাত্র পঠনযোগ্য নয়) উদাহরণস্বরূপ, আমি যথাযথ সতর্কতার সাথে অজানা বিশেষত্বের একটি বিন থেকে এক টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে অন্য জায়গায় রেখে দিতে পারি take

এটি কতটা সহায়তা করে তা নিশ্চিত নয়। পলিমারফিজমের উপস্থিতিতে পয়েন্টার থেকে পয়েন্টার সম্পূর্ণ স্পষ্ট নয় obvious


5

ইংরেজীতে:

এটা একটা ব্যাপার Listকিছু টাইপ যে বর্গ প্রসারিত এর HasWordসহHasWord

সাধারণভাবে ?জেনারিক বলতে কোনও শ্রেণি বোঝায়। এবং extends SomeClassনির্দিষ্ট করে যে object বস্তুটি অবশ্যই প্রসারিত SomeClassকরতে হবে (বা সেই শ্রেণি হতে হবে)।


1
আসলে ক্লাসের পরিবর্তে টাইপ করুন । এটি ইন্টারফেসের জন্য ঠিক পাশাপাশি কাজ করে।
পাওলো ইবারম্যান

1

প্রশ্ন চিহ্নটি ওয়াইল্ডকার্ড সংজ্ঞায়িত করতে ব্যবহৃত হয় । তাদের সম্পর্কে ওরাকল ডকুমেন্টেশন চেকআউট করুন: http://docs.oracle.com

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