অ্যারে কোভেরিয়েন্ট তবে জেনেরিকগুলি অবিস্মরণীয় কেন?


160

জোশুয়া ব্লচের কার্যকর জাভা থেকে,

  1. অ্যারে দুটি গুরুত্বপূর্ণ উপায়ে জেনেরিক ধরণের থেকে পৃথক। প্রথম অ্যারেগুলি কোভেরিয়েন্ট। জেনারিকস অবিস্মরণীয়।
  2. কোভেরিয়েন্টের অর্থ সহজভাবে যদি X এর Y টাইপের সাব টাইপ হয় তবে এক্স [] এছাড়াও Y এর সাব টাইপ হবে []। স্ট্রিংটি অবজেক্ট সো এর সাব টাইপ হওয়ায় অ্যারেগুলি সমকামী হয়

    String[] is subtype of Object[]

    আক্রমণকারীটির সহজ অর্থ X এর Y টাইপের উপ-প্রকার নির্বিশেষে,

     List<X> will not be subType of List<Y>.

আমার প্রশ্ন হল জাভাতে অ্যারে কোভেরিয়েন্ট করার সিদ্ধান্ত কেন? অন্যান্য এসও পোস্ট রয়েছে যেমন অ্যারে হানাদার কেন, তবে তালিকাগুলি তালিকাভুক্ত? , তবে তারা স্কালায় মনোনিবেশিত বলে মনে হচ্ছে এবং আমি তা অনুসরণ করতে সক্ষম নই।


1
জেনেরিকগুলি পরে যুক্ত হয়েছিল বলে এটি কি নয়?
সোটিরিওস ডেলিমনোলিস

1
আমি মনে করি অ্যারে এবং সংগ্রহের মধ্যে তুলনা করা অন্যায্য, সংগ্রহগুলি ব্যাকগ্রাউন্ডে অ্যারে ব্যবহার করে !!
আহমেদ আদেল ইসমাইল

4
@ ইএল-কনস্টিটেড-মন্টি টিয়ারবেন্টিখ সমস্ত সংগ্রহ উদাহরণস্বরূপ নয় LinkedList
পল বেলোরা

@ পলবেলোরা আমি জানি যে সংগ্রহ বাস্তবায়নকারীদের থেকে মানচিত্রগুলি পৃথক, তবে আমি এসসিপিজে 6 তে পড়েছি যে সংগ্রহগুলি সাধারণত অ্যারেগুলিতে নির্ভর করে !!
আহমেদ আদেল ইসমাইল

কারণ এখানে অ্যারেস্টোর এক্সসেপশন নেই; যখন সংগ্রহটিতে ভুল উপাদান সন্নিবেশ করানো হয় যেখানে অ্যারে যেমন রয়েছে। সুতরাং সংগ্রহটি কেবল পুনরুদ্ধার সময়ে এবং এটিও কাস্টিংয়ের কারণে খুঁজে পেতে পারে। সুতরাং জেনারিকগুলি এই সমস্যার সমাধান নিশ্চিত করবে।
কানাগাভেলু সুগুমার

উত্তর:


150

উইকিপিডিয়া মাধ্যমে :

জাভা এবং সি # এর প্রাথমিক সংস্করণগুলিতে জেনেরিকগুলি (ওরফে প্যারামেট্রিক পলিমারফিজম) অন্তর্ভুক্ত হয়নি।

এই ধরণের সেটিংয়ে অ্যারে আক্রমণকারীকে কার্যকর বহুবিক প্রোগ্রামগুলি বিধি বিধান করে। উদাহরণস্বরূপ, একটি অ্যারে পরিবর্তন করতে একটি ফাংশন লিখতে বিবেচনা করুন, বা এমন একটি ফাংশন যা Object.equalsউপাদানগুলিতে পদ্ধতি ব্যবহার করে সাম্যের জন্য দুটি অ্যারে পরীক্ষা করে। প্রয়োগটি অ্যারেতে সংরক্ষিত উপাদানগুলির সঠিক ধরণের উপর নির্ভর করে না, সুতরাং সমস্ত ধরণের অ্যারেগুলিতে কাজ করে এমন একক ফাংশন লিখতে হবে। এটি টাইপ ফাংশন বাস্তবায়ন করা সহজ

boolean equalArrays (Object[] a1, Object[] a2);
void shuffleArray(Object[] a);

যাইহোক, যদি অ্যারে প্রকারগুলি আক্রমণকারী হিসাবে বিবেচিত হয় তবে কেবলমাত্র ঠিক এই ধরণের অ্যারেতে এই ফাংশনগুলি কল করা সম্ভব হবে Object[]। উদাহরণস্বরূপ, একটি স্ট্রিংয়ের অ্যারে পরিবর্তন করা যায়নি।

অতএব, জাভা এবং সি # উভয়ই অ্যারে প্রকারকে সমবায় আচরণ করে। উদাহরণস্বরূপ, সি # string[]তে একটি উপপ্রকার object[], এবং জাভাতে String[]একটি উপ-প্রকার Object[]

এটি "অ্যারে কোভেরিয়েন্ট হয় কেন?", বা আরও সঠিকভাবে এই প্রশ্নের উত্তর দেয়, " সেই সময় অ্যারে কেন সমবায় তৈরি করা হয়েছিল ?"

জেনেরিকগুলি চালু করার সময়, জন স্কিটির এই উত্তরে চিহ্নিত কারণগুলির কারণে তাদের উদ্দেশ্যমূলকভাবে সমবায়িক তৈরি করা হয়নি :

না, ক List<Dog>না List<Animal>। আপনি একটি দিয়ে কী করতে পারেন তা বিবেচনা করুন List<Animal>- আপনি এটিতে কোনও প্রাণী যুক্ত করতে পারেন ... একটি বিড়াল সহ। এখন, আপনি কি যুক্তিসঙ্গতভাবে কুকুরছানাগুলির লিটারে একটি বিড়াল যুক্ত করতে পারেন? একেবারে না.

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new List<Dog>();
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

হঠাৎ আপনার একটি খুব বিভ্রান্ত বিড়াল আছে।

উইকিপিডিয়া নিবন্ধে বর্ণিত অ্যারে কোভেরিয়েন্ট তৈরির আসল প্রেরণা জেনেরিকের ক্ষেত্রে প্রযোজ্য হয়নি কারণ ওয়াইল্ডকার্ডরা কোভেরিয়েন্স (এবং বৈপরীত্য) এর অভিব্যক্তিটিকে সম্ভব করে তুলেছিল, উদাহরণস্বরূপ:

boolean equalLists(List<?> l1, List<?> l2);
void shuffleList(List<?> l);

3
হ্যাঁ, অ্যারেগুলি পলিমারফিক আচরণের অনুমতি দেয়, তবে এটি রানটাইম এক্সপিকেশনগুলি প্রবর্তন করে (জেনেরিকের সাথে সংকলন-সময় ব্যতিক্রমগুলির তুলনায়)। যেমন:Object[] num = new Number[4]; num[1]= 5; num[2] = 5.0f; num[3]=43.4; System.out.println(Arrays.toString(num)); num[0]="hello";
উত্সাহী শিখুন

21
এটাই সঠিক. অ্যারেগুলির পুনরায় সংশোধনযোগ্য প্রকার রয়েছে এবং ArrayStoreExceptionপ্রয়োজন অনুসারে নিক্ষেপ করুন । স্পষ্টতই এটি সেই সময়ে একটি উপযুক্ত আপস হিসাবে বিবেচিত হয়েছিল। আজকের সাথে এটির বৈসাদৃশ্য করুন: অনেকে পূর্বসূত্র হিসাবে অ্যারে কোভেরিয়েন্সকে একটি ভুল হিসাবে বিবেচনা করে।
পল বেলোরা

1
"অনেক" কেন এটিকে ভুল বলে বিবেচনা করে? অ্যারে কোভেরিয়েন্স না রাখার চেয়ে এটি অনেক বেশি কার্যকর। আপনি কতবার অ্যারেস্টোর এক্সসেপশন দেখেছেন; তারা বেশ বিরল। এখানে বিড়ম্বনাটি ক্ষমাযোগ্য ইমো ... জাভাতে এখন পর্যন্ত করা সবচেয়ে খারাপ ভুলগুলির মধ্যে রয়েছে ব্যবহারের সাইট ভেরিয়েন্স ওরফে ওয়াইল্ডকার্ড।
স্কট

3
@ স্কটমিসকিন্নি: "কেন" অনেকে "এটিকে ভুল মনে করেন?" এআইইউআই, এটি কারণ অ্যারে কোভারিয়েন্সের জন্য সমস্ত অ্যারে অ্যাসাইনমেন্ট ক্রিয়াকলাপগুলিতে গতিশীল ধরণের পরীক্ষা করা প্রয়োজন (যদিও সংকলক অপ্টিমাইজেশানগুলি সম্ভবত সহায়তা করতে পারে?) যা একটি উল্লেখযোগ্য রানটাইম ওভারহেডের কারণ হতে পারে।
ডোমিনিক ডিভরিজ

ধন্যবাদ, ডোমিনিক, তবে আমার পর্যবেক্ষণ থেকে এটি মনে হয় কারণ "অনেকে" এটিকে ভুল হিসাবে বিবেচনা করছেন বলে মন্তব্য করেছেন অন্য কয়েকজন যা বলেছে তা তোতা দেওয়ার সময়টি। আবার অ্যারে covariance এ নতুন চেহারা, এটি ক্ষতির চেয়ে অনেক বেশি কার্যকর। আবার জাভা আসল বিআইজি ভুলটি ছিল ওয়াইল্ডকার্ডের মাধ্যমে ব্যবহারের সাইটের জেনেরিক ভেরিয়েন্স। "অনেক" স্বীকার করতে চেয়েছি বলে এটি আরও সমস্যার সৃষ্টি করেছে।
স্কট

30

কারণটি হ'ল প্রতিটি অ্যারে রানটাইম চলাকালীন তার উপাদান প্রকারটি জানে, অন্যদিকে জেনেরিক সংগ্রহটি মুছে ফেলার কারণে নয়।

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

String[] strings = new String[2];
Object[] objects = strings;  // valid, String[] is Object[]
objects[0] = 12; // error, would cause java.lang.ArrayStoreException: java.lang.Integer during runtime

জেনেরিক সংগ্রহের মাধ্যমে যদি এটি অনুমোদিত হয়:

List<String> strings = new ArrayList<String>();
List<Object> objects = strings;  // let's say it is valid
objects.add(12);  // invalid, Integer should not be put into List<String> but there is no information during runtime to catch this

তবে এটি পরে সমস্যা তৈরি করবে যখন কেউ তালিকায় প্রবেশ করার চেষ্টা করবে:

String first = strings.get(0); // would cause ClassCastException, trying to assign 12 to String

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

@ ব্যবহারকারী 2708477, হ্যাঁ, টাইপ মোছাটি পশ্চাদপটে সামঞ্জস্যের কারণে প্রবর্তিত হয়েছিল। এবং হ্যাঁ, আমার উত্তর শিরোনামে প্রশ্নের জবাব দেওয়ার চেষ্টা করে, কেন জেনেরিকগুলি অবিস্মরণীয়।
ক্যাটোনা

অ্যারেগুলি তাদের ধরণটি জানে তার অর্থ এই যে যখন সম্প্রচার কোড কোডটি এমন কোনও অ্যারেতে সংরক্ষণ করতে বলবে যেখানে এটি খাপ খায় না - এর অর্থ এই নয় যে এই জাতীয় স্টোর সঞ্চালনের অনুমতি দেওয়া হবে। ফলস্বরূপ, অ্যারেগুলি কোভেরিয়েন্ট হওয়ার ফলে যে পরিমাণ বিপদ সংঘটিত হয়েছিল তা যদি তাদের ধরণগুলি না জানত তবে তার চেয়ে অনেক কম।
সুপারক্যাট

@ সুপের্যাট, সঠিক, আমি যা উল্লেখ করতে চেয়েছিলাম তা হ'ল জেনারিকদের জায়গায় টাইপ মুছে ফেলার জন্য, রানওয়ারটাইম চেকগুলির ন্যূনতম সুরক্ষার সাথে সমবায় বাস্তবায়ন করা যেত না
কাতোনা

1
আমি ব্যক্তিগতভাবে মনে করি যে এই সংকলন যখন সংগ্রহগুলি হতে পারে না তখন অ্যারেগুলি কেন সমজাতীয় সে সম্পর্কে সঠিক উত্তর সরবরাহ করে। ধন্যবাদ!
asgs

22

এই সাহায্য হতে পারে: -

জেনারিক্স সমবায় নয় are

জাভা ভাষার অ্যারেগুলি সমবায়ু - যার অর্থ যদি পূর্ণসংখ্যা যদি সংখ্যাটি প্রসারিত করে (যা এটি করে) তবে কেবলমাত্র একটি পূর্ণসংখ্যাও একটি সংখ্যা নয়, তবে একটি পূর্ণসংখ্যা [] Number[]ও একটি এবং আপনি পাস করার বা নির্ধারিত করতে নির্দ্বিধায় Integer[]যেখানে একটি Number[]বলা হয়। (আরও আনুষ্ঠানিকভাবে, যদি সংখ্যাটি পূর্ণসংখ্যার একটি সুপারটাইপ হয়, তবে Number[]এটি একটি সুপারটাইপ Integer[])) আপনি সম্ভবত জেনেরিক ধরণের ক্ষেত্রেও একই সত্য বলে মনে করতে পারেন - এটি List<Number>একটি সুপারটাইপ List<Integer>, এবং List<Integer>যেখানে আপনি List<Number>প্রত্যাশিত সেখানে যেতে পারেন । দুর্ভাগ্যক্রমে, এটি সেভাবে কাজ করে না।

দেখা যাচ্ছে যে এটি সেভাবে কাজ করে না এমন একটি ভাল কারণ রয়েছে: এটি যে ধরণের সুরক্ষা জেনারিকগুলি সরবরাহ করার কথা ছিল তা ভঙ্গ করবে। কল্পনা করুন আপনি একটি দায়িত্ব অর্পণ পারে List<Integer>একটি থেকে List<Number>। তারপরে নীচের কোডটি আপনাকে এমন কোনও কিছু স্থাপন করার অনুমতি দেবে যা কোনও তেমন কোনও পূর্ণসংখ্যা নয় List<Integer>:

List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));

কারণ ln একটি List<Number>, এটিতে একটি ফ্লোট যুক্ত করা পুরোপুরি আইনী বলে মনে হয়। তবে যদি এলএন এর সাথে যুক্ত হয় li, তবে এটি লি-এর সংজ্ঞায় অন্তর্ভুক্ত প্রকারের সুরক্ষা প্রতিশ্রুতি ভঙ্গ করবে - এটি পূর্ণসংখ্যার একটি তালিকা, যার কারণে জেনেরিক প্রকারগুলি সমবায়ীয় হতে পারে না।


3
অ্যারেগুলির জন্য, আপনি ArrayStoreExceptionরানটাইমে একটি পান।
সোটিরিওস ডেলিমনলিস

4
আমার প্রশ্ন হ'ল WHYঅ্যারে কোভিয়েরেন্ট বানানো। যেমনটি সোটেরিওস উল্লেখ করেছেন, অ্যারে দিয়ে রানার সময় একজন অ্যারেস্টোরএকসেপশন পাবেন, যদি অ্যারেগুলি ইনভেটারেন্ট করা হয়, তবে আমরা সংকলনের সময় এই ত্রুটিটি সঠিকভাবে সনাক্ত করতে পারি?
উত্সাহী শিখুন

@ ইজার্তো লেয়ার্ন: জাভার একটি প্রধান অর্থগত দুর্বলতা হ'ল এটির ধরণের সিস্টেমে "অ্যারে যা ডেরিভেটিভস ব্যতীত কিছুই রাখে না তার পার্থক্য করতে Animalপারে না Animal, " অ্যারে থেকে অন্য কোথাও প্রাপ্ত কোনও আইটেম গ্রহণ করতে হবে না যার মধ্যে অবশ্যই কিছুই থাকতে হবে , এবং অবশ্যই এর বাহ্যিকভাবে সরবরাহিত রেফারেন্সগুলি গ্রহণ করতে ইচ্ছুক হতে হবে AnimalCode কোডটির জন্য যা পূর্বের প্রয়োজন তার একটি অ্যারে গ্রহণ করা উচিত Catতবে যে কোডটির পরবর্তীটির দরকার নেই তা যদি সংকলক দুটি প্রকারের পার্থক্য করতে পারে তবে এটি সংকলন-সময় চেক সরবরাহ করতে পারে। দুর্ভাগ্যক্রমে, তাদের আলাদা করার একমাত্র জিনিস ...
সুপারক্যাট

... কোডটি আসলে তাদের মধ্যে কিছু সংরক্ষণ করার চেষ্টা করে কিনা, এবং রানটাইম পর্যন্ত এটি জানার উপায় নেই।
সুপারক্যাট

3

কমপক্ষে দুটি কারণে অ্যারেগুলি সহকর্মী:

  • এটি এমন তথ্য সংগ্রহের জন্য দরকারী যা কোনমতে রূপান্তরিত হবে না কোভেরিয়েন্টে। টি সংগ্রহকে সমবায় রূপান্তর করার জন্য, এর ব্যাকিং স্টোরটি অবশ্যই সমবায়ু হতে হবে। যদিও কেউ একটি অপরিবর্তনীয় Tসংগ্রহ ডিজাইন করতে পারে যা T[]এটির ব্যাকিং স্টোর হিসাবে ব্যবহার করে না (যেমন গাছ বা সংযুক্ত তালিকার ব্যবহার) তবে এ জাতীয় সংগ্রহের পাশাপাশি অ্যারে দ্বারা সমর্থিত কোনও কাজ সম্পাদন করার সম্ভাবনা কম। যে কেউ তর্ক করতে পারে যে সমবায়ু অবিচ্ছিন্ন সংগ্রহের সরবরাহের জন্য আরও ভাল উপায় হ'ল তারা "ব্যাকিং স্টোরটি ব্যবহার করতে পারতেন" সমবায়ু স্থায়ী অ্যারে "টাইপ সংজ্ঞায়িত করতে পারতেন, তবে কেবল অ্যারে কোভেরিয়েন্সের অনুমতি দেওয়া সম্ভবত সহজ ছিল।

  • অ্যারেগুলি ঘন ঘন কোড দ্বারা পরিবর্তিত হবে যা তাদের মধ্যে কী ধরণের জিনিস হতে যাচ্ছে তা জানে না, তবে সেই অ্যারেতে যা পড়া হয়নি তা অ্যারেতে রাখবে না। এর একটি প্রধান উদাহরণ কোড বাছাই করা। ধারণাগতভাবে অ্যারে প্রকারের পক্ষে উপাদানগুলি অদল-বদল করার বা অনুমতি দেওয়ার পদ্ধতি অন্তর্ভুক্ত করা সম্ভব ছিল (এ জাতীয় পদ্ধতিগুলি কোনও অ্যারের ক্ষেত্রে সমানভাবে প্রযোজ্য হতে পারে), বা একটি "অ্যারে ম্যানিপুলেটর" অবজেক্টটি সংজ্ঞায়িত করে যা অ্যারের সাথে রেফারেন্স রাখে এবং এক বা একাধিক জিনিস যা সেখান থেকে পড়েছিল এবং এতে আগে থেকে পঠিত আইটেমগুলি যে অ্যারে থেকে এসেছিল সেগুলিতে এটি সংরক্ষণ করার পদ্ধতি অন্তর্ভুক্ত থাকতে পারে। যদি অ্যারেগুলি সমবায় না হয় তবে ব্যবহারকারীর কোড এ জাতীয় ধরণ নির্ধারণ করতে সক্ষম হয় না, তবে রানটাইমটি কিছু বিশেষ পদ্ধতি অন্তর্ভুক্ত করতে পারে।

অ্যারেগুলি সিভিলিয়েন্ট হওয়ার বিষয়টি কুৎসিত হ্যাক হিসাবে দেখা যেতে পারে তবে বেশিরভাগ ক্ষেত্রে এটি কার্যকরী কোড তৈরিতে সহায়তা করে।


1
The fact that arrays are covariant may be viewed as an ugly hack, but in most cases it facilitates the creation of working code.- ভাল কথা
উত্সাহী শিখুন

3

প্যারামিট্রিক ধরণের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল পলিমারফিক অ্যালগরিদমগুলি লেখার ক্ষমতা, অর্থাৎ আলগোরিদিমগুলি যা কোনও প্যারামিটারের মান নির্বিশেষে কোনও ডেটা স্ট্রাকচারে কাজ করে Arrays.sort()

জেনেরিক্স সহ, এটি ওয়াইল্ডকার্ড ধরণের মাধ্যমে সম্পন্ন হয়েছে:

<E extends Comparable<E>> void sort(E[]);

সত্যিকারের উপকারী হওয়ার জন্য, ওয়াইল্ডকার্ড ধরণের জন্য ওয়াইল্ডকার্ড ক্যাপচারের প্রয়োজন হয় এবং এর জন্য একটি টাইপ প্যারামিটারের ধারণা প্রয়োজন। জাভাতে অ্যারে যুক্ত করার সময় এগুলির মধ্যে কোনওটিই পাওয়া যায় নি, এবং রেফারেন্স ধরণের কোভেরিয়েন্টের অ্যারেগুলি তৈরি করে পলিমারফিক আলগোরিদিমগুলিকে অনুমতি দেওয়ার জন্য আরও সহজ উপায়ের অনুমতি দেওয়া হয়েছিল:

void sort(Comparable[]);

যাইহোক, এই সরলতা স্ট্যাটিক টাইপ সিস্টেমে একটি ফাঁক খুলল:

String[] strings = {"hello"};
Object[] objects = strings;
objects[0] = 1; // throws ArrayStoreException

রেফারেন্স ধরণের অ্যারেতে প্রতিটি লেখার অ্যাক্সেসের একটি রানটাইম চেকের প্রয়োজন।

সংক্ষেপে, জেনারিকদের দ্বারা সংযুক্ত নতুন পদ্ধতির সাহায্যে টাইপ সিস্টেমটি আরও জটিল হয়ে ওঠে, তবে আরও পরিসংখ্যানগতভাবে সুরক্ষিত থাকে, তবে পুরানো পদ্ধতির সহজ ছিল, এবং কম স্ট্যাটিকালি টাইপ নিরাপদ ছিল। ভাষার ডিজাইনাররা সহজ পদ্ধতির পক্ষে বেছে নিয়েছিলেন, টাইপ সিস্টেমে একটি ছোট লুফোল বন্ধ করার চেয়ে আরও গুরুত্বপূর্ণ কাজ করার কারণে এটি খুব কমই সমস্যার সৃষ্টি করে। পরে, যখন জাভাটি প্রতিষ্ঠিত হয়েছিল, এবং টিপিংয়ের যত্ন নেওয়া দরকার ছিল তখন জেনেরিকদের জন্য এটি সঠিকভাবে করার মতো সংস্থান ছিল (তবে অ্যারেগুলির জন্য এটি পরিবর্তন করলে জাভা প্রোগ্রামগুলি ভেঙে যেতে পারে)।


2

জেনেরিক্স পরিবর্তিত হয় থেকে JSL 4.10 :

... সাবটাইপিং জেনেরিক ধরণের মাধ্যমে প্রসারিত হয় না: টি <: ইউ বোঝায় না যে C<T><: C<U>...

এবং আরও কয়েকটি লাইন, জেএলএস আরও ব্যাখ্যা করে যে
অ্যারেগুলি কোভারিয়েন্ট (প্রথম বুলেট):

৪.১০.৩ অ্যারে প্রকারের মধ্যে সাব-টাইপিং

এখানে চিত্র বর্ণনা লিখুন


2

আমি মনে করি তারা প্রথম স্থানে একটি ভুল সিদ্ধান্ত নিয়েছিল যা অ্যারে কোভেরিয়েন্ট তৈরি করেছিল। এখানে বর্ণিত সুরক্ষাটি এটি ভেঙে দেয় এবং পিছিয়ে সামঞ্জস্যের কারণে তারা এতে আটকে যায় এবং এর পরে তারা জেনেরিকের জন্য একই ভুল না করার চেষ্টা করে। এবং এটি যে কারণগুলির মধ্যে অন্যতম যে জোশুয়া ব্লাচ "কার্যকর জাভা (দ্বিতীয় সংস্করণ)" বইয়ের আইটেম 25-তে অ্যারা ওয়াইসের তালিকাগুলি পছন্দ করে fers


জোশের ব্লক জাভা সংগ্রহের কাঠামোর (১.২) লেখক এবং জাভার জেনারিকের লেখক (1.5) 1.5 সুতরাং যে লোকটি জেনেরিকগুলি তৈরি করেছিল যার সম্পর্কে প্রত্যেকে অভিযোগ করে সেও কাকতালীয়ভাবে সেই ছেলে যিনি এই বইটি লিখেছিলেন যে তারা যাওয়ার আরও ভাল উপায়? বিশাল আশ্চর্য নয়!
সিপুরী

1

আমার গ্রহণ: কোডটি যখন অ্যারের A এর প্রত্যাশা করে এবং আপনি এটিকে বি [] দেন যেখানে বি এ এর ​​একটি উপক্লাস, তখন দু'টি বিষয়ই উদ্বিগ্ন হওয়ার দরকার: আপনি যখন অ্যারে উপাদানটি পড়েন তখন কী ঘটে এবং আপনি লিখলে কী ঘটে? এটা। সুতরাং এই ক্ষেত্রে সুরক্ষা যে সমস্ত ক্ষেত্রে সংরক্ষণ করা হয়েছে তা নিশ্চিত করার জন্য ভাষার নিয়মগুলি লেখা কঠিন নয় (মূল নিয়মটি হ'ল ArrayStoreExceptionআপনি যদি একটি বিতে আটকে রাখার চেষ্টা করেন তবে একটি নিক্ষিপ্ত হতে পারে []] জেনেরিকের জন্য, যদিও আপনি যখন ক্লাস ঘোষণা করেন SomeClass<T>, শ্রেণীর Tশরীরে অনেকগুলি উপায় ব্যবহার করা যেতে পারে এবং আমি অনুমান করছি যে নিয়ম লেখার জন্য সমস্ত সম্ভাব্য সংমিশ্রণগুলি কার্যকর করার পক্ষে এটি খুব জটিল জিনিস অনুমোদিত এবং যখন না হয়।

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