কেন যখন আমি অ্যারেলিস্টগুলির একটি অ্যারে করার চেষ্টা করি: ArrayList<Integer>[] arr=new ArrayList<Integer>[40];
ত্রুটি আছে এবং জাভা এটির অনুমতি দেয় না?
জাভা জেনেরিক প্রয়োগ, কোনও ভাষায় জেনারিকস বা যথেচ্ছ কিছু প্রয়োগের সাথে সম্পর্কিত কি কারণ আছে?
কেন যখন আমি অ্যারেলিস্টগুলির একটি অ্যারে করার চেষ্টা করি: ArrayList<Integer>[] arr=new ArrayList<Integer>[40];
ত্রুটি আছে এবং জাভা এটির অনুমতি দেয় না?
জাভা জেনেরিক প্রয়োগ, কোনও ভাষায় জেনারিকস বা যথেচ্ছ কিছু প্রয়োগের সাথে সম্পর্কিত কি কারণ আছে?
উত্তর:
এই জাভার জেনেরিক্স প্রধান গর্ত এক, অ্যারে covariant , যার মানে হল ধরনের একটি অ্যারের Foo[]
একটি উপশ্রেণী হয় Object[]
এবং ParentOfFoo[]
। এর সাথে বৈসাদৃশ্য করুন List<Foo>
যার সাথে এই আচরণ নেই।
জাভাতে জেনারিকস ছিল না তখন এটি গুরুত্বপূর্ণ ছিল (জাভা 5 অবধি) কারণ অন্যথায়, জেনেরিক বাছাইয়ের ফাংশনের মতো কিছু অসম্ভব ছিল।
তবে এটির এই জটিল সমস্যাটি রয়েছে যা অ্যারিগুলি রান টাইমে কী ধরণের তা জানতে পছন্দ করে । তবে জাভাতে জেনেরিকগুলি মুছে ফেলার উপর ভিত্তি করে। এই দুটি জিনিস মোটেও জাল হয় না এবং এটিই আমরা আমাদের সমস্যাটি পাই।
সুতরাং এর দীর্ঘ এবং সংক্ষিপ্তসারটি হ'ল, জাভা 1-এ, কোভেরিয়েন্ট অ্যারেগুলি আংশিকভাবে গর্তটি পূরণ করেছে যা জেনেরিকের অভাব তৈরি করেছে। তবে যখন তারা এই গর্তটি সঠিকভাবে পূরণ করার চেষ্টা করেছিলেন, পিছনের সামঞ্জস্যের অর্থ দাঁড়ায় যে অ্যারেগুলি কার্যকর করা অসম্ভব ছিল।
আসলে, যে ছেলেটি আসলে জেনেরিকদের জন্য কাঠামো তৈরি করেছিল, মার্টিন ওডারস্কি, কেন তিনি স্কালা তৈরি করেছিলেন সে সম্পর্কে একটি সাক্ষাত্কারের সময় এখানে এই সম্পর্কে কথা বলেছেন । (আপনি যদি স্কালার ইতিহাসে আদৌ আগ্রহী হন তবে বেশ আকর্ষণীয়)
জাভা জেনেরিক প্রয়োগ, কোনও ভাষায় জেনারিকস বা যথেচ্ছ কিছু প্রয়োগের সাথে সম্পর্কিত কি কারণ আছে?
আসলে এটি কিছুটা নির্বিচারে।
সমস্যাটি হ'ল এটি টাইপ সিস্টেমে একটি গর্তের অনুমতি দেয়, যেহেতু ArrayList<T>[]
কাস্ট করা যায় Object[]
এবং তারপরে আপনি ArrayList<U>
অ্যারেটিতে একটি রেখে দিতে পারেন , যেখানে U != T
।
জাভা ডিজাইনাররা একেবারেই অনুমতি না দিয়ে এই গর্তটিকে যতটা সম্ভব উত্সাহিত করার সিদ্ধান্ত নিয়েছে new ArrayList<T>[N]
।
তবে জেনেরিকের অ্যারে উপস্থাপনের অনুমতি না দিয়ে এটিও প্লাগ করা যেতে পারে ("চেক না করা" সতর্কতা ছাড়াই)।
Integer
একটি মধ্যে Object[]
আসলে একটি যেString[]