জাভার জেনেরিক গুলিতে কী ভুল? [বন্ধ]


49

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




যেমন ক্লিনটন শুরু করুন ( "iBatis লোক") বললেন, "তারা কাজ করে না ..."
মশা

উত্তর:


54

জাভার জেনেরিক প্রয়োগকরণ ধরণ ক্ষয় ব্যবহার করে । এর অর্থ হ'ল আপনার দৃ typ়ভাবে টাইপিত জেনেরিক সংগ্রহগুলি Objectরান টাইমে আসলে টাইপের হয়। এটিতে কিছু পারফরম্যান্স বিবেচনা রয়েছে কারণ এর অর্থ জেনেরিক সংগ্রহে যোগ করার সময় আদিম প্রকারগুলি অবশ্যই বক্স করা উচিত। সংকলন টাইম ধরণের নির্ভুলতার সুবিধাগুলি পিছনে সামঞ্জস্যের উপর ধরণের মুছে ফেলা এবং আবেগিক ফোকাসের সাধারণ বোকাতা ছাড়িয়ে যায়।


4
কেবল যোগ করার জন্য, মুছে ফেলার ধরণের কারণে, রানটাইমে জেনেরিক তথ্য পুনরুদ্ধার করা সম্ভব না আপনি যদি না TypeLiteral গুগল-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/… এর
জেরেমি হিলার

43
যার অর্থnew ArrayList<String>.getClass() == new ArrayList<Integer>.getClass()
স্বরে নোট করুন - একটি নাম ভাবেন

9
@ জোব না এটি করেন না। এবং সি ++ টেমপ্লেটগুলি রূপক বিপাকে সম্পূর্ণরূপে আলাদা পদ্ধতির ব্যবহার করে। এটি হাঁস-টাইপিং ব্যবহার করে এবং আপনি দরকারী জিনিসগুলি করতে পারেন যেমন template<T> T add(T v1, T v2) { return v1->add(v2); }আপনি সেখানে একটি ফাংশন তৈরির সত্যিকারের জেনেরিক উপায় আছে addযা এই জিনিসগুলি যে দুটি বিষয়ই হোক না কেন, তাদের কেবল add()একটি প্যারামিটারের সাথে নামকরণের পদ্ধতি থাকতে হবে ।
ত্রিনিদাদ

7
@ জোব এটি কোড উত্পন্ন, সত্যিই। টেমপ্লেটগুলি সি প্রিপ্রসেসরকে প্রতিস্থাপন করার জন্য বোঝানো হয় এবং এটি করার জন্য তাদের কিছু চতুর কৌশল করতে সক্ষম হওয়া উচিত এবং এগুলি নিজেই একটি ট্যুরিং-সম্পূর্ণ ভাষা হয়। জাভা জেনেরিকগুলি কেবল টাইপ-নিরাপদ ধারকগুলির জন্য চিনি এবং সি # জেনেরিকগুলি আরও ভাল তবে তবুও কোনও দরিদ্র ব্যক্তির সি ++ টেম্পলেট।
ত্রিনিদাদ

3
@ জোব আফাইক, জাভা জেনেরিকরা প্রতিটি নতুন জেনেরিক ধরণের জন্য কোনও শ্রেণি তৈরি করে না, এটি কেবল কোডটিতে টাইপকাস্ট যুক্ত করে যা জেনেরিক পদ্ধতি ব্যবহার করে, সুতরাং এটি আসলে মেটা-প্রোগ্রামিং আইএমও নয়। সি # টেমপ্লেটগুলি প্রতিটি জেনেরিক প্রকারের জন্য নতুন কোড তৈরি করে, এটি হ'ল আপনি যদি সি # এর বিশ্বে তালিকা <int> এবং তালিকা <ডাবল> ব্যবহার করেন তবে তাদের প্রত্যেকের জন্য কোড উত্পন্ন হবে। টেমপ্লেটের তুলনায়, সি # জেনেরিকদের এখনও এটি জানতে হবে যে আপনি কোন ধরণের খাবার খাওয়াতে পারেন আপনি যে সহজ Addউদাহরণটি দিয়েছিলেন তা আপনি বাস্তবায়ন করতে পারবেন না , এটি কোন শ্রেণিতে প্রয়োগ করা যেতে পারে তা আগেই না জেনে উপায় নেই, যা একটি অপূর্ণতা।
ত্রিনিদাদ

26

ইতিমধ্যে জাভা-দ্য ল্যাঙ্গুয়েজ, জেভিএম এবং জাভা ক্লাস লাইব্রেরির সংমিশ্রণে মনোনিবেশ করা হয়েছে এমন উত্তরগুলি লক্ষ্য করুন।

জাভা-ভাষা সম্পর্কিত যতটা জাভা এর জেনেরিকের সাথে কিছুই নেই। সি # বনাম জাভা জেনেরিকগুলিতে বর্ণিত হিসাবে , জাভা এর জেনেরিকগুলি ভাষা স্তর 1 এ বেশ সুক্ষ্ম ।

সাবমোটিমাল হ'ল জেভিএম সরাসরি জেনারিকসকে সমর্থন করে না, এর বেশ কয়েকটি বড় পরিণতি রয়েছে:

  • ক্লাস লাইব্রেরির প্রতিবিম্ব-সম্পর্কিত অংশগুলি জাভা-দ্য ভাষায় উপলভ্য পূর্ণ টাইপ তথ্য প্রকাশ করতে পারে না
  • কিছু পারফরম্যান্স জরিমানা জড়িত

আমি মনে করি আমি যে পার্থক্যটি তৈরি করছি তা একটি পেডেন্টিক হিসাবে জাভা-ভাষাটি সর্বব্যাপী লক্ষ্য হিসাবে জেভিএম এবং মূল পাঠাগার হিসাবে জাভা ক্লাস লাইব্রেরির সাথে সংকলিত হয়েছে।

1 ওয়াইল্ডকার্ডের সম্ভাব্য ব্যাতিক্রমের সাথে, যা সাধারণ ক্ষেত্রে প্রকারটিকে অনুমানযোগ্য বলে মনে করে able এটি সি # এবং জাভা জেনেরিকের মধ্যে একটি প্রধান পার্থক্য যা খুব বেশি প্রায়ই উল্লেখ করা হয় না। ধন্যবাদ, অ্যান্টিমনি।


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

2
@ ট্রিনিডাড তবে আমি বলিনি জাভার জেনেরিকস নেই, তাই আমি দেখতে পাচ্ছি না এটি কীভাবে একই রকম। এবং হ্যাঁ, জেভিএমকে তাদের সমর্থন করার দরকার নেই , ঠিক তেমনি সি ++ কোডটি অনুকূলিত করার প্রয়োজন নেই । তবে এটি অপ্টিমাইজ না করা অবশ্যই "ভুল কিছু" হিসাবে গণ্য হবে।
রোমান স্টারকভ

3
আমি যে যুক্তি দিয়েছিলাম তা হ'ল জেভিএমের জেনেরিকদের প্রতিফলন ব্যবহার করতে সক্ষম হওয়ার জন্য তাদের সরাসরি সমর্থন পাওয়ার দরকার নেই। অন্যরা এটি করেছে তাই এটি করা যায়, সমস্যাটি হ'ল জাভা জেনেরিক থেকে নতুন ক্লাস তৈরি করে না, কোনও পুনর্নির্মাণের জিনিস নয়।
ত্রিনিদাদ

4
@ ট্রিনিডাড: সি ++ তে, যথেষ্ট সময় এবং মেমরির সংকলককে ধরে নিয়ে টেমপ্লেটগুলি যে কোনও কিছু করতে ব্যবহৃত হতে পারে এবং সংকলনের সময় উপলভ্য তথ্যের সাথে যা কিছু করা যায় (যেহেতু টেমপ্লেট সংকলন টিউরিং-সম্পূর্ণ), কিন্তু রয়েছে প্রোগ্রাম চালানোর আগে উপলভ্য নয় এমন তথ্য ব্যবহার করে টেমপ্লেট তৈরি করার কোনও উপায় নেই। নেট মধ্যে, বিপরীতে, একটি প্রোগ্রামের জন্য ইনপুট ভিত্তিতে প্রকার তৈরি করা সম্ভব; এমন একটি প্রোগ্রাম লিখতে মোটামুটি সহজ হবে যেখানে তৈরি করা যেতে পারে বিভিন্ন ধরণের সংখ্যা মহাবিশ্বে ইলেক্ট্রনের সংখ্যার চেয়ে বেশি।
সুপারক্যাট

2
@ ত্রিনিদাদ: স্পষ্টতই, প্রোগ্রামটির কোনও একক প্রয়োগই এই সমস্ত প্রকারের (বা সত্যই, তাদের একটি অগণিত ভগ্নাংশের বাইরে কিছু) তৈরি করতে পারেনি, তবে মূল বিষয়টি এটি করার দরকার নেই। এটি কেবল এমন ধরণের তৈরি করতে হবে যা প্রকৃতপক্ষে ব্যবহৃত হয়। একটির এমন একটি প্রোগ্রাম থাকতে পারে যা যেকোন স্বেচ্ছাসেবী সংখ্যা (যেমন 8675309) গ্রহণ করতে পারে এবং এ থেকে সেই সংখ্যার (যেমন Z8<Z6<Z7<Z5<Z3<Z0<Z9>>>>>>>) একটি অনন্য প্রকার তৈরি করতে পারে, যার অন্য কোনও ধরণের থেকে আলাদা সদস্য থাকতে পারে। সি ++ এ, যে কোনও ধরণের ইনপুট থেকে উত্পন্ন হতে পারে এমন সমস্ত ধরণের সংকলন সময়ে তৈরি করতে হবে।
22:32

13

সাধারণ সমালোচনা হ'ল সংশোধনের অভাব। এর অর্থ রানটাইমের সময় অবজেক্টগুলিতে তাদের জেনেরিক আর্গুমেন্ট সম্পর্কে তথ্য থাকে না (যদিও তথ্যটি এখনও ক্ষেত্র, পদ্ধতি, নির্মাণকারী এবং বর্ধিত শ্রেণি এবং ইন্টারফেসে উপস্থিত রয়েছে)। এর অর্থ হল আপনি নিক্ষেপ করতে পারে যে, বলো, ArrayList<String>করতে List<File>। সংকলক আপনাকে সতর্কবার্তা দেবে, তবে এটি আপনাকে সতর্ক করে দেবে যদি আপনি ArrayList<String>কোনও Objectরেফারেন্সের জন্য এ্যাসাইন নেন এবং তারপরে এটি কাস্ট করেন List<String>। আপসাইডগুলি হ'ল জেনারিকের সাথে আপনার সম্ভবত কাস্টিং করা উচিত নয়, অপ্রয়োজনীয় ডেটা ছাড়া অবশ্যই পারফরম্যান্স আরও ভাল এবং অবশ্যই পশ্চাদপটে সামঞ্জস্যতা।

কিছু লোক অভিযোগ করে যে আপনি জেনেরিক যুক্তি ( void fn(Set<String>)এবং void fn(Set<File>)) এর ভিত্তিতে ওভারলোড করতে পারবেন না । পরিবর্তে আপনাকে আরও ভাল পদ্ধতির নাম ব্যবহার করতে হবে। নোট করুন যে এই ওভারলোডিংয়ের পুনঃনির্ধারণের প্রয়োজন হবে না, কারণ ওভারলোডিং একটি স্থির, সংকলন-সময় সমস্যা।

আদিম ধরণের জেনেরিকের সাথে কাজ করে না।

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


"নোট করুন যে এই ওভারলোডিংয়ের পুনঃনির্ধারণের প্রয়োজন হবে না, কারণ ওভারলোডিং একটি স্থির, সংকলন-সময় সমস্যা" " তাই না? এটি কীভাবে সংস্কার ছাড়াই কাজ করবে? কোন পদ্ধতিতে কল করতে হবে তা জানতে কী কী JVM আপনার রান টাইমে জানতে হবে না?
ম্যাট্রিক্সফ্রোগ

2
@ ম্যাট্রিক্সফ্রোগ নং হিসাবে আমি যেমন বলেছি, ওভারলোডিং একটি সংকলন-সময় বিষয়। সংকলক একটি নির্দিষ্ট ওভারলোড নির্বাচন করতে অভিব্যক্তির স্থিতিশীল ধরণের ব্যবহার করে, যা ক্লাস ফাইলে লিখিত পদ্ধতি। আপনার কাছে থাকলে Object cs = new char[] { 'H', 'i' }; System.out.println(cs);আজেবাজে মুদ্রিত হন। ধরণ পরিবর্তন csকরতে char[]এবং আপনি পাবেন Hi
টম হাটিন -

10

জাভা জেনেরিকগুলি স্তন্যপান করে কারণ আপনি নিম্নলিখিতটি করতে পারবেন না:

public class AsyncAdapter<Parser,Adapter> extends AsyncTask<String,Integer,Adapter> {
    proptected Adapter doInBackground(String... keywords) {
      Parser p = new Parser(keywords[0]); // this is an error
      /* some more stuff I was hoping for but couldn't do because
         the compiler wouldn't let me
      */
    }
}

জেনেরিক্স আসলে জেনেরিক ক্লাস প্যারামিটার হলে এটির কাজ করার জন্য উপরের কোডে প্রতিটি ক্লাসের কসাই করার দরকার নেই।


আপনার প্রতিটি ক্লাস কসাই করার দরকার নেই। আপনার কেবলমাত্র একটি উপযুক্ত কারখানার শ্রেণি যুক্ত করতে হবে এবং এটি AsyncAdapter এ ইনজেক্ট করতে হবে। (এবং মৌলিকভাবে এটি জেনেরিকদের সম্পর্কে নয়, তবে সত্য যে নির্মাণকারীরা জাভাতে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না)।
পিটার টেলর

13
@ পিটারটেলর: একটি উপযুক্ত কারখানার শ্রেণি কেবল সমস্ত বয়লারপ্লেটকে দৃষ্টিশক্তির বাইরে ফেলে অন্য কিছুতে সরিয়ে দেয় এবং এটি এখনও সমস্যার সমাধান করে না। এখন প্রতিবার যখনই আমি একটি নতুন উদাহরণ ইনস্ট্যান্ট Parserকরতে চাই তখন আমাকে কারখানার কোডটি আরও সংশ্লেষিত করা দরকার। "জেনেরিক" যদি সত্যই জেনেরিক বোঝায় তবে কারখানার প্রয়োজন নেই এবং অন্য সমস্ত বাজে কথা যা নকশার ধরণগুলির নামে চলে goes আমি গতিশীল ভাষাগুলিতে কাজ করতে পছন্দ করি এমন অনেক কারণগুলির মধ্যে একটি।
davidk01

2
কখনও কখনও সি ++ এর মতো, যেখানে আপনি টেমপ্লেট + ভার্চুয়াল ব্যবহার করার সময় কোনও কনস্ট্রাক্টরের ঠিকানাটি পাস করতে পারবেন না - আপনি কেবল তার পরিবর্তে কারখানার ফান্টেক্টর ব্যবহার করতে পারেন।
কে কে কোয়ান

জাভা চুষছে কারণ আপনি কোনও পদ্ধতির নামের আগে "প্রস্তাবিত" লিখতে পারবেন না? তুমি এত নিচ. গতিশীল ভাষায় লেগে থাকুন। এবং বিশেষত হাস্কেল থেকে সাবধান থাকুন।
fdreger

5
  • নিখরচায় জেনেরিক পরামিতিগুলির জন্য সংকলক সতর্কতাগুলি যে কোনও উদ্দেশ্যই ব্যবহার করে না ভাষাটি অর্থহীনভাবে ভার্বোস করে, যেমন public String getName(Class<?> klazz){ return klazz.getName();}

  • জেনারিকস অ্যারে দিয়ে ভাল খেলেন না

  • হারানো ধরণের তথ্য প্রতিবিম্বকে ingালাই এবং নালী টেপকে গোলমাল করে তোলে।


আমি HashMapপরিবর্তে ব্যবহারের জন্য কোনও সতর্কতা পেলে আমি বিরক্ত হই HashMap<String, String>
মাইকেল কে

1
@ মিশেল কিন্তু সেটিকে আসলে জেনেরিকের সাথে ব্যবহার করা উচিত ...
বিকল্প

অ্যারে সমস্যা পুনরায় সংশোধনযোগ্যতার দিকে যায়। ব্যাখ্যার জন্য জাভা জেনেরিক্স বই (অলিগেটর) দেখুন।
ncmathsadist

5

আমি মনে করি অন্যান্য উত্তরগুলি এটি কিছুটা ডিগ্রিতে বলেছে, তবে খুব পরিষ্কার নয়। জেনেরিকগুলির একটি সমস্যা প্রতিবিম্ব প্রক্রিয়া চলাকালীন জেনেরিক ধরণ হারাচ্ছে। উদাহরণস্বরূপ:

List<String> arr = new ArrayList<String>();
assertTrue( ArrayList.class, arr.getClass() );
TypeVarible[] types = arr.getClass().getTypedVariables();

দুর্ভাগ্যক্রমে, ফিরে আসা প্রকারগুলি আপনাকে বলতে পারে না যে অ্যারের জেনেরিক ধরণের স্ট্রিং। এটি একটি সূক্ষ্ম পার্থক্য, কিন্তু এটি গুরুত্বপূর্ণ। কারণ আরআর রানটাইম সময়ে তৈরি হয়েছে জেনেরিক প্রকারগুলি রানটাইমের সময় মুছে ফেলা হয় যাতে আপনি এটি বের করতে পারেন না। কিছু বর্ণিত ArrayList<Integer>যেমন ArrayList<String>প্রতিচ্ছবি দৃষ্টিভঙ্গি থেকে একই দেখায় ।

এটি জেনেরিক্সের ব্যবহারকারীর পক্ষে কিছু না।

Factory<MySpecialObject> factory = new Factory<MySpecialObject>();
MySpecialObject obj = factory.create();

ধরা যাক আমরা একটি জেনেরিক কারখানার একটি উদাহরণ তৈরি করতে চেয়েছিলাম MySpecialObjectকারণ এটি কংক্রিট জেনেরিক ধরণের যা আমরা এই উদাহরণটির জন্য ঘোষণা করেছিলাম। ওয়েল ফ্যাক্টরি ক্লাস এই উদাহরণের জন্য ঘোষিত কংক্রিটের প্রকারটি জানতে নিজের জিজ্ঞাসাবাদ করতে পারে না কারণ জাভা সেগুলি মুছে ফেলে।

। নেট এর জেনেরিকগুলিতে আপনি এটি করতে পারেন কারণ রানটাইমের সময় অবজেক্টটি জেনেরিক প্রকারগুলি জানে কারণ সংকলক এটি বাইনারিতে মেনে চলে। মুছে ফেলার সাথে জাভা এটি করতে পারে না।


1

আমি জেনেরিক্স সম্পর্কে কয়েকটি ভাল কথা বলতে পারি , তবে এটি ছিল না প্রশ্ন। আমি অভিযোগ করতে পারি যে তারা রান সময়ে পাওয়া যায় না এবং অ্যারে দিয়ে কাজ করে না, তবে এটি উল্লেখ করা হয়েছে।

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

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

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

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


ভাল অভিজাত। তবে, অনেকগুলি লাইব্রেরি / ফ্রেমওয়ার্ক রয়েছে যা জেনেরিকগুলি ছাড়াই থাকতে পারে, যেমন, গুইস, গসন, হাইবারনেট। জেনেরিকস একবার ব্যবহার করতে অভ্যস্ত হয়ে ওঠার পরে সেগুলি হার্ড হয় না। টাইপ এবং টাইপ আর্গুমেন্ট পড়া একটি বাস্তব পিআইটিএ; এখানে Val যদি আপনি ব্যবহার করতে পারেন সাহায্য করে।
মার্টিনাস

1
@ মাআর্টিনাস: লিখেছেন কিছুক্ষণ আগে। এছাড়াও ওপি "সমস্যা" জিজ্ঞাসা করেছিলেন। আমি জেনেরিকগুলি অত্যন্ত দরকারী এবং তাদের অনেক পছন্দ করি - এর চেয়ে এখন অনেক বেশি। তবে, আপনি যদি নিজের সংগ্রহ লিখছেন তবে সেগুলি শেখা খুব শক্ত। তাদের উপযোগিতা fades যখন আপনার সংগ্রহ ধরন রান সময়ে নির্ধারণ করা হয় - যখন সংগ্রহে একটি পন্থা নেই কহন আপনি তার এন্ট্রির বর্গ। এই মুহূর্তে জেনেরিকগুলি কাজ করে না এবং আপনার আইডিই কয়েকশ অর্থহীন সতর্কতা তৈরি করবে। জাভা প্রোগ্রামিংয়ের 99.99% এতে জড়িত নয়। কিন্তু আমি চাই শুধু একটি ছিল অনেক এই সঙ্গে ঝামেলা যখন আমি উপরে পোষ্ট লিখেছেন।
রাল্ফচাপিন

জাভা এবং সি # বিকাশকারী উভয়ই হওয়ায় আমি ভাবছি আপনি জাভা সংগ্রহগুলি কেন পছন্দ করবেন?
Ivaylo স্লাভভ

Fine. But without generics this error would throw a ClassCastException really quick at run time with little time wasted.এটি প্রোগ্রামের প্রারম্ভকালে এবং প্রশ্নের মধ্যে কোডের লাইনে আঘাতের মধ্যে কতটা রান সময় হয় তার উপর নির্ভর করে। যদি কোনও ব্যবহারকারী ত্রুটির কথা জানায় এবং পুনরুত্পাদন করতে আপনার কয়েক মিনিট (বা, সবচেয়ে খারাপ পরিস্থিতি, ঘন্টা বা এমনকি কয়েক দিন) সময় নেয় তবে সেই সংকলন-সময় যাচাইটি আরও ভাল এবং আরও ভাল
ম্যাসন হুইলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.