জাভা জেনেরিক্স আদিম ধরণের সমর্থন করে না কেন?


236

জাভাতে জেনেরিকগুলি ক্লাস নিয়ে কাজ করে তবে আদিম ধরণের সাথে নয়?

উদাহরণস্বরূপ, এটি দুর্দান্ত কাজ করে:

List<Integer> foo = new ArrayList<Integer>();

তবে এটি অনুমোদিত নয়:

List<int> bar = new ArrayList<int>();

1
int i = (int) নতুন অবজেক্ট (); সংকলন যদিও ঠিক।
শচীন ভার্মা

উত্তর:


243

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

এই:

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), এবং আদিম ধরণের নয়। সুতরাং এগুলি জেনেরিকগুলিতে ব্যবহার করা যাবে না।


8
@ ড্যানিয়েল আয়েটকিন - আসলে জাভা জেনেরিকগুলি মোটেও সি ++ টেম্পলেটগুলির মতো পরিচালিত হয় না ...
স্টিফেন সি

20
জাভা সংকলক ব্যবহারের আগে কেন আদিম টাইপটি বক্স করতে পারে না? এটা কি সম্ভব?
vrwim

13
@vrwim - এটি সম্ভব হতে পারে। তবে এটি কেবল সিনট্যাকটিক চিনি হবে। আসল সমস্যাটি হ'ল বাক্সিত আদিমগুলি সহ জাভা জেনেরিকগুলি সি ++ / সি # মডেলের তুলনায় সময় এবং স্থান উভয়ই তুলনামূলকভাবে ব্যয়বহুল ... যেখানে প্রকৃত আদিম ধরণের ব্যবহৃত হয়।
স্টিফেন সি

6
@ মৌগানআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআললসইইনইহহহহহহহহহহহহহহহহ। আশা করি এটি জাভা 10 (বা আমি শুনেছি) এবং উচ্চতর অর্ডার ফাংশনে স্থির হয়ে উঠব। আমাকে যে উদ্ধৃত করবেন না।
সিড

4
@ সিড সম্পূর্ণরূপে সম্মত হন যে এটির খারাপ নকশা যা প্রারম্ভিক
ব্যক্তিদের যেমন

37

জাভা সালে জেনেরিক্স উপায় যে তারা কাজ ... অন্তত অংশে ... কারণ তারা পরে ভাষা পরিকল্পনা করা হয়েছিল বছর একটি সংখ্যা ভাষা যোগ করা হয় নি 1 । ভাষা ডিজাইনার ছিল সীমাবদ্ধ একটি নকশা যে বিদ্যমান ভাষা সঙ্গে সাযুজ্যপূর্ণ ছিল নিয়ে আসা থাকার জেনেরিক্স জন্য তাদের বিকল্পগুলিতে এবং জাভা শ্রেণী গ্রন্থাগার

অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি (যেমন সি ++, সি #, অ্যাডা) আদিম ধরণেরগুলি জেনেরিকের জন্য প্যারামিটার ধরণের হিসাবে ব্যবহার করার অনুমতি দেয়। তবে এটি করার পিছনের দিকটি হ'ল এই জাতীয় ভাষার জেনেরিকের প্রয়োগ (বা টেমপ্লেট প্রকারের) সাধারণত প্রতিটি ধরণের প্যারামিটারাইজেশনের জন্য জেনেরিক ধরণের স্বতন্ত্র অনুলিপি উত্পন্ন করে।


1 - জেনারিকগুলি জাভা 1.0 তে অন্তর্ভুক্ত না করার কারণটি ছিল সময় চাপের কারণে। তারা মনে করেছিল যে ওয়েব ব্রাউজারগুলির দ্বারা উপস্থাপিত নতুন বাজারের সুযোগটি পূরণ করার জন্য তাদের জাভা ভাষাটি দ্রুত মুক্তি দিতে হবে। জেমস গোসলিং বলেছেন যে জেনেরিকদের সময় থাকলে তিনি অন্তর্ভুক্ত করতে পছন্দ করতেন। জাভা ভাষাটি দেখতে যদি এমনটি হত তবে এটি কারও অনুমান।


11

জাভা জেনেরিকস পিছনে সামঞ্জস্যের জন্য "টাইপ ইরেজর" ব্যবহার করে প্রয়োগ করা হয়। সমস্ত জেনেরিক প্রকারগুলি রানটাইমে অবজেক্টে রূপান্তরিত হয়। উদাহরণ স্বরূপ,

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()

এখন প্রশ্ন হল কেন "অবজেক্ট" রানটাইম টাইপ হিসাবে বেছে নেওয়া হয়?

উত্তর হ'ল অবজেক্ট হ'ল সমস্ত বস্তুর সুপারক্লাস এবং যে কোনও ব্যবহারকারীর সংজ্ঞায়িত অবজেক্টকে উপস্থাপন করতে পারে।

যেহেতু সমস্ত আদিম পদার্থ " অবজেক্ট " থেকে উত্তরাধিকারসূত্রে আসে না তাই আমরা এটিকে জেনেরিক প্রকার হিসাবে ব্যবহার করতে পারি না।

এফওয়াইআই: প্রকল্প ভালহল্লা উপরের ইস্যুটি সমাধান করার চেষ্টা করছে।


যথাযথ নামকরণের জন্য প্লাস 1।
ড্রাজেন জেলভুক

7

সংগ্রহগুলি এমন এক ধরণের প্রয়োজন যা সংজ্ঞা থেকে সংজ্ঞায়িত করা হয় java.lang.Object। বেসটাইপগুলি কেবল এটি করে না।


26
আমি মনে করি এখানে প্রশ্নটি "কেন"। জেনারিকদের কেন অবজেক্টসের প্রয়োজন হয়? Sensক্যমত্য বলে মনে হয় যে এটি কোনও ডিজাইনের পছন্দ কম এবং পশ্চাদপটে সামঞ্জস্যের প্রতি আরও বেশি আকস্মিক। আমার দৃষ্টিতে, জেনেরিকগুলি যদি আদিমগুলি পরিচালনা করতে না পারে তবে এটি কার্যকারিতার ঘাটতি। যেমনটি দাঁড়িয়েছে, প্রতিটি আদিমদের জন্য আদিমদের সাথে যুক্ত সমস্ত কিছু লিখতে হবে: তুলনামূলক <টি, টি> এর পরিবর্তে আমাদের ইন্টিজার ডট কম (ইন্ট এ, ইনট বি), বাইট ডট কম (বাইট এ, বাইট বি) ইত্যাদি রয়েছে have এটি কোনও সমাধান নয়!
জন পি

1
হ্যাঁ জেনারিকগুলি আদিম ধরণের চেয়ে বেশি হওয়া উচিত একটি বৈশিষ্ট্য। এটির একটি প্রস্তাবের লিঙ্কটি এখানে রয়েছে openjdk.java.net/jeps/218
কাক

5

অনুযায়ী জাভা ডকুমেন্টেশন জেনেরিক টাইপ ভেরিয়েবল শুধুমাত্র রেফারেন্সের ধরনের, না আদিম ধরনের সঙ্গে instantiated করা যেতে পারে।

এটি প্রকল্প ভালহালার অধীনে জাভা 10 এ আসার কথা ।

ইন ব্রায়ান Goetz কাগজ বিশেষায়িত ক্ষেত্র রাজ্য

যে কারণে জেনেরিক আদিমতার জন্য সমর্থন করা হয়নি সে সম্পর্কে একটি দুর্দান্ত ব্যাখ্যা রয়েছে । এবং এটি কীভাবে ভবিষ্যতের জাভাতে প্রকাশিত হবে

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

...

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


0

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

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