অ্যারেগুলি কোভেরিয়েন্ট
অ্যারেগুলি সমবায়িক হিসাবে বলা হয় যার মূলত এর অর্থ যে, জাভা এর সাব-টাইপিং বিধিগুলি দেওয়া হলে টাইপের একটি অ্যারেতে টাইপের T[]
উপাদান T
বা কোনও উপ- টাইপ থাকতে পারে T
। এই ক্ষেত্রে
Number[] numbers = new Number[3];
numbers[0] = newInteger(10);
numbers[1] = newDouble(3.14);
numbers[2] = newByte(0);
কিন্তু না শুধুমাত্র জাভা রাজ্যের subtyping বিধি জারি করে যে একটি অ্যারের যে S[]
অ্যারের একটি উপপ্রকার হয় T[]
যদি S
একটি উপপ্রকার হয় T
তাই ভালো কিছু এছাড়াও বৈধ:
Integer[] myInts = {1,2,3,4};
Number[] myNumber = myInts;
কারণ জাভাতে সাব টাইপিং নিয়ম অনুসারে, একটি অ্যারে একটি অ্যারের Integer[]
একটি উপপ্রকার, Number[]
কারণ পূর্ণসংখ্যার সংখ্যার একটি উপ টাইপ pe
তবে এই সাব-টাইপিং নিয়মটি একটি আকর্ষণীয় প্রশ্নকে ডেকে আনতে পারে: আমরা যদি এটি করার চেষ্টা করি তবে কী হবে?
myNumber[0] = 3.14; //attempt of heap pollution
এই শেষ লাইনটি ঠিক জরিমানা সংকলন করবে, তবে আমরা যদি এই কোডটি চালাই তবে আমরা একটি ArrayStoreException
পাই কারণ আমরা একটি সংখ্যার অ্যারেতে একটি ডাবল রাখার চেষ্টা করছি। যে সংখ্যাটি আমরা রেফারেন্সের মাধ্যমে অ্যারে অ্যাক্সেস করছি তা এখানে অপ্রাসঙ্গিক, কী গুরুত্বপূর্ণ তা হল অ্যারেটি পূর্ণসংখ্যার অ্যারে।
এর অর্থ এই যে আমরা সংকলকটিকে বোকা বানাতে পারি, তবে রান-টাইম টাইপ সিস্টেমটিকে বোকা বানাতে পারি না। এবং এটি তাই কারণ অ্যারে আমরা একটি সংশোধনযোগ্য টাইপ কল। এর অর্থ রান-টাইমে জাভা জানে যে এই অ্যারেটি আসলে পূর্ণসংখ্যার অ্যারে হিসাবে ইনস্ট্যান্ট করা হয়েছিল যা কেবল প্রকারের রেফারেন্সের মাধ্যমে অ্যাক্সেস করা যায় Number[]
।
সুতরাং, যেমন আমরা দেখতে পাচ্ছি, একটি জিনিস হ'ল অবজেক্টের প্রকৃত প্রকার, অন্য একটি বিষয় হল রেফারেন্সের ধরণ যা আমরা এটি অ্যাক্সেস করতে ব্যবহার করি, তাই না?
জাভা জেনারিক্সের সাথে সমস্যা
এখন, জাভাতে জেনেরিক ধরণের সমস্যা হ'ল ধরণের পরামিতিগুলির জন্য টাইপ তথ্য কোড সংকলনের পরে সংকলক দ্বারা বাতিল করা হয়; তাই রান টাইমে এই ধরণের তথ্য পাওয়া যায় না। এই প্রক্রিয়াটিকে টাইপ ইরেজোর বলা হয় । জাভাতে এর মতো জেনেরিকগুলি প্রয়োগ করার ভাল কারণ রয়েছে তবে এটি একটি দীর্ঘ গল্প এবং এটি পূর্ব-বিদ্যমান কোডের সাথে বাইনারি সামঞ্জস্যের সাথে করতে হবে।
এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল রান-টাইমে যেহেতু কোনও ধরণের তথ্য নেই, তাই আমরা নিশ্চিত হচ্ছি যে আমরা heাল দূষণ করছি না।
আসুন এখন নীচের অনিরাপদ কোডটি বিবেচনা করুন:
List<Integer> myInts = newArrayList<Integer>();
myInts.add(1);
myInts.add(2);
List<Number> myNums = myInts; //compiler error
myNums.add(3.14); //heap polution
যদি জাভা সংকলক আমাদের এটি করা থেকে বিরত না করে, রান-টাইম টাইপ সিস্টেমটি আমাদের থামাতে পারে না কারণ রান-টাইমে কোনও উপায় নেই, এটি নির্ধারণ করার জন্য যে এই তালিকাটি কেবলমাত্র পূর্ণসংখ্যার একটি তালিকা হতে পারে determine জাভা রান-টাইম আমাদের এই তালিকায় যা যা চাই তা দেবে, যখন এটিতে কেবল পূর্ণসংখ্যা থাকতে হবে, কারণ এটি তৈরি করার সময় এটি পূর্ণসংখ্যার তালিকা হিসাবে ঘোষণা করা হয়েছিল। এজন্য সংকলকটি 4 নম্বর লাইনটিকে প্রত্যাখ্যান করেছে কারণ এটি অনিরাপদ এবং যদি অনুমতি দেওয়া হয় তবে টাইপ সিস্টেমের অনুমানগুলি ভঙ্গ করতে পারে।
যেমন, জাভা ডিজাইনারগণ নিশ্চিত করেছিলেন যে আমরা সংকলকটিকে বোকা বানাতে পারি না। আমরা যদি সংকলকটিকে বোকা না করতে পারি (যেমন অ্যারে দিয়ে করতে পারি) তবে আমরা রান-টাইম টাইপ সিস্টেমটিকে বোকা বানাতে পারি না।
যেমনটি, আমরা বলি যে জেনেরিক প্রকারগুলি পুনরায় সংশোধনযোগ্য নয়, যেহেতু রান সময়ে আমরা জেনেরিক ধরণের প্রকৃত প্রকৃতি নির্ধারণ করতে পারি না।
আমি এই উত্তরের কয়েকটি অংশ এড়িয়ে গেছি আপনি এখানে পুরো নিবন্ধটি পড়তে পারেন:
https://dzone.com/articles/covariance- এবং- নিয়ন্ত্রণ