উত্তর:
জাভাতে জেনেরিকস সম্পূর্ণরূপে সংকলন-সময় নির্মাণ - সংকলক সমস্ত জেনেরিক ব্যবহারকে কাস্টগুলিতে ডান ধরণে পরিণত করে। এটি পূর্ববর্তী জেভিএম রানটাইমগুলির সাথে পিছনের দিকে সামঞ্জস্য বজায় রাখার জন্য।
এই:
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);
পরিণত হয় (মোটামুটি):
List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);
সুতরাং, জেনেরিক হিসাবে ব্যবহৃত যে কোনও কিছুই অবজেক্টে রূপান্তরিত হতে হবে (উদাহরণস্বরূপ এটি get(0)
একটি প্রদান করে Object
), এবং আদিম ধরণের নয়। সুতরাং এগুলি জেনেরিকগুলিতে ব্যবহার করা যাবে না।
জাভা সালে জেনেরিক্স উপায় যে তারা কাজ ... অন্তত অংশে ... কারণ তারা পরে ভাষা পরিকল্পনা করা হয়েছিল বছর একটি সংখ্যা ভাষা যোগ করা হয় নি 1 । ভাষা ডিজাইনার ছিল সীমাবদ্ধ একটি নকশা যে বিদ্যমান ভাষা সঙ্গে সাযুজ্যপূর্ণ ছিল নিয়ে আসা থাকার জেনেরিক্স জন্য তাদের বিকল্পগুলিতে এবং জাভা শ্রেণী গ্রন্থাগার ।
অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি (যেমন সি ++, সি #, অ্যাডা) আদিম ধরণেরগুলি জেনেরিকের জন্য প্যারামিটার ধরণের হিসাবে ব্যবহার করার অনুমতি দেয়। তবে এটি করার পিছনের দিকটি হ'ল এই জাতীয় ভাষার জেনেরিকের প্রয়োগ (বা টেমপ্লেট প্রকারের) সাধারণত প্রতিটি ধরণের প্যারামিটারাইজেশনের জন্য জেনেরিক ধরণের স্বতন্ত্র অনুলিপি উত্পন্ন করে।
1 - জেনারিকগুলি জাভা 1.0 তে অন্তর্ভুক্ত না করার কারণটি ছিল সময় চাপের কারণে। তারা মনে করেছিল যে ওয়েব ব্রাউজারগুলির দ্বারা উপস্থাপিত নতুন বাজারের সুযোগটি পূরণ করার জন্য তাদের জাভা ভাষাটি দ্রুত মুক্তি দিতে হবে। জেমস গোসলিং বলেছেন যে জেনেরিকদের সময় থাকলে তিনি অন্তর্ভুক্ত করতে পছন্দ করতেন। জাভা ভাষাটি দেখতে যদি এমনটি হত তবে এটি কারও অনুমান।
জাভা জেনেরিকস পিছনে সামঞ্জস্যের জন্য "টাইপ ইরেজর" ব্যবহার করে প্রয়োগ করা হয়। সমস্ত জেনেরিক প্রকারগুলি রানটাইমে অবজেক্টে রূপান্তরিত হয়। উদাহরণ স্বরূপ,
public class Container<T> {
private T data;
public T getData() {
return data;
}
}
রানটাইম হিসাবে দেখা হবে হিসাবে,
public class Container {
private Object data;
public Object getData() {
return data;
}
}
সংকলক প্রকারের সুরক্ষা নিশ্চিত করতে যথাযথ কাস্ট সরবরাহের জন্য দায়বদ্ধ।
Container<Integer> val = new Container<Integer>();
Integer data = val.getData()
হয়ে যাবে
Container val = new Container();
Integer data = (Integer) val.getData()
এখন প্রশ্ন হল কেন "অবজেক্ট" রানটাইম টাইপ হিসাবে বেছে নেওয়া হয়?
উত্তর হ'ল অবজেক্ট হ'ল সমস্ত বস্তুর সুপারক্লাস এবং যে কোনও ব্যবহারকারীর সংজ্ঞায়িত অবজেক্টকে উপস্থাপন করতে পারে।
যেহেতু সমস্ত আদিম পদার্থ " অবজেক্ট " থেকে উত্তরাধিকারসূত্রে আসে না তাই আমরা এটিকে জেনেরিক প্রকার হিসাবে ব্যবহার করতে পারি না।
এফওয়াইআই: প্রকল্প ভালহল্লা উপরের ইস্যুটি সমাধান করার চেষ্টা করছে।
সংগ্রহগুলি এমন এক ধরণের প্রয়োজন যা সংজ্ঞা থেকে সংজ্ঞায়িত করা হয় java.lang.Object
। বেসটাইপগুলি কেবল এটি করে না।
অনুযায়ী জাভা ডকুমেন্টেশন জেনেরিক টাইপ ভেরিয়েবল শুধুমাত্র রেফারেন্সের ধরনের, না আদিম ধরনের সঙ্গে instantiated করা যেতে পারে।
এটি প্রকল্প ভালহালার অধীনে জাভা 10 এ আসার কথা ।
ইন ব্রায়ান Goetz কাগজ বিশেষায়িত ক্ষেত্র রাজ্য
যে কারণে জেনেরিক আদিমতার জন্য সমর্থন করা হয়নি সে সম্পর্কে একটি দুর্দান্ত ব্যাখ্যা রয়েছে । এবং এটি কীভাবে ভবিষ্যতের জাভাতে প্রকাশিত হবে ।
জাভার বর্তমান মুছে ফেলা বাস্তবায়ন যা সমস্ত রেফারেন্স ইনস্ট্যান্টেশনের জন্য একটি শ্রেণি তৈরি করে এবং আদিম পদক্ষেপগুলির জন্য কোনও সমর্থন করে না। (এটি একটি সাদৃশ্য অনুবাদ, এবং জাভা এর জেনেরিকগুলি কেবলমাত্র রেফারেন্স প্রকারের মধ্যেই সীমাবদ্ধ হতে পারে জেভিএমের বাইটকোড সেটের ক্ষেত্রে সম্মোহক অনুবাদের সীমাবদ্ধতা থেকে, যা আদিম প্রকারের তুলনায় রেফারেন্স ধরণের ক্রিয়াকলাপের জন্য বিভিন্ন বাইটকোড ব্যবহার করে)) তবে জাভাতে মুছে ফেলা জেনেরিকগুলি উভয় আচরণগত প্যারামিট্রিটি (জেনেরিক পদ্ধতি) এবং ডেটা প্যারামিট্রিসিটি (জেনেরিক ধরণের কাঁচা এবং ওয়াইল্ডকার্ড ইনস্ট্যান্টেশন) সরবরাহ করে)
...
একটি একজাত অনুবাদ কৌশল বেছে নেওয়া হয়েছিল, যেখানে জেনেরিক ধরণের ভেরিয়েবলগুলি তাদের সীমাতে মুছে ফেলা হয় কারণ তারা বাইকোডে অন্তর্ভুক্ত রয়েছে। এর অর্থ হল যে কোনও শ্রেণি জেনেরিক হোক বা না হোক, এটি এখনও একই নাম সহ একটি একক শ্রেণিতে সংকলিত হয় এবং যার সদস্যের স্বাক্ষরগুলি একই are প্রকার সুরক্ষা সংকলনের সময় যাচাই করা হয়, এবং রানটাইম জেনেরিক টাইপ সিস্টেমের দ্বারা নিখরচায় থাকে। ফলস্বরূপ, এটি জেনারিকগুলি কেবলমাত্র রেফারেন্স ধরণের উপর কাজ করতে পারে এই নিষেধাজ্ঞা আরোপ করেছিল, যেহেতু অবজেক্টটি সর্বাধিক সাধারণ প্রকার হিসাবে উপলব্ধ এবং এটি আদিম ধরণের ক্ষেত্রে প্রসারিত হয় না।
কোনও অবজেক্ট তৈরি করার সময়, আপনি টাইপ প্যারামিটারের জন্য কোনও আদিম ধরণের বিকল্প তৈরি করতে পারবেন না this এই বিধিনিষেধের কারণ হিসাবে এটি একটি সংকলক বাস্তবায়ন সমস্যা issue ভার্চুয়াল মেশিন স্ট্যাকের উপর লোড এবং সংরক্ষণের জন্য আদিম ধরণের নিজস্ব বাইকোড নির্দেশাবলী রয়েছে। সুতরাং এই পৃথক বাইকোড পাথগুলিতে আদিম জেনেরিকগুলি সংকলন করা অসম্ভব নয়, তবে এটি সংকলকটিকে জটিল করে তুলবে।