কেউ কেউ দাবি করেন যে জাভা জেনেরিকের প্রয়োগ খারাপ?


115

আমি মাঝে মধ্যে শুনেছি জেনেরিক্স সহ জাভা এটি সঠিকভাবে পায় নি। (নিকটতম রেফারেন্স, এখানে )

আমার অনভিজ্ঞতা ক্ষমা করুন, তবে কী তাদের আরও ভাল করে তুলেছে?


23
আমি এটি বন্ধ করার কোনও কারণ দেখতে পাচ্ছি না; সমস্ত জঞ্জাল জেনেরিকদের সম্পর্কে ঘুরে বেড়াতে, জাভা এবং সি # এর মধ্যে পার্থক্যের মধ্যে কিছু স্পষ্টতা থাকা লোককে অবহিতভাবে কাদা ছিটিয়ে দেওয়ার চেষ্টা করতে সহায়তা করতে পারে।
রব

উত্তর:


146

খারাপ:

  • সংকলনের সময় প্রকারের তথ্য নষ্ট হয়ে যায়, তাই মৃত্যুদন্ড কার্যকর করার সময় আপনি এটি বলতে চান না যে এটি কী ধরনের হতে হবে meant
  • মান ধরণের জন্য ব্যবহার করা যায় না (এটি একটি বিগ - এটিতে List<byte>প্রকৃত পক্ষে byte[]উদাহরণস্বরূপ ব্যাক করা হয় এবং কোনও বক্সিং প্রয়োজন হয় না)
  • জেনেরিক পদ্ধতিগুলি কল করার সিনট্যাক্স (আইএমও)
  • সীমাবদ্ধতার জন্য সিনট্যাক্স বিভ্রান্ত হতে পারে
  • ওয়াইল্ডকার্ডিং সাধারণত বিভ্রান্তিকর
  • উপরের কারণে বিভিন্ন বিধিনিষেধ - কাস্টিং ইত্যাদি

ভাল:

  • ওয়াইল্ডকার্ডিং কলিং সাইডে কোভেরিয়েন্স / বিপরীততা নির্দিষ্ট করার অনুমতি দেয় যা অনেক পরিস্থিতিতে খুব ঝরঝরে
  • কিছু না থাকার থেকে এটা ভালো!

51
@ পল: আমি মনে করি আমি আসলে সাময়িক ভাঙ্গন তবে একটি শালীন এপিআই পছন্দ করতাম। অথবা। নেট রুট নিন এবং নতুন সংগ্রহের প্রকারগুলি প্রবর্তন করুন। (.০.NET জেনেরিকগুলি ১.১ অ্যাপ্লিকেশনগুলিকে
ভাঙেনি

6
একটি বড় বিদ্যমান কোড বেস সহ, আমি এই সত্যটি পছন্দ করি যে আমি যে পদ্ধতিতে কল করি তারা সবাই পরিবর্তন না করে জেনেরিক ব্যবহার করার জন্য একটি পদ্ধতির স্বাক্ষর পরিবর্তন করতে শুরু করতে পারি।
পল টমলিন

38
তবে এর ডাউনসাইডগুলি বিশাল এবং স্থায়ী। একটি বড় স্বল্পমেয়াদী জয়, এবং একটি দীর্ঘমেয়াদী ক্ষতি আইএমও আছে।
জন স্কিটি

11
জন - "এটি কোনও কিছুর চেয়ে ভাল" বিষয়গত :)
MetroidFan2002

6
@ রোজারিও: আপনি দাবি করেছেন যে আমার প্রথম "খারাপ" আইটেমটি সঠিক নয়। আমার প্রথম "খারাপ" আইটেমটি বলে যে তথ্য সংকলনের সময় হারিয়ে গেছে। এটি ভুল হওয়ার জন্য, আপনি অবশ্যই বলছেন যে সংকলনের সময় তথ্যটি হারিয়ে যায় না ... অন্য বিকাশকারীদের বিভ্রান্ত করার জন্য, আমি যা বলছি তার দ্বারা আপনি কেবল বিভ্রান্ত বলে মনে করছেন।
জন স্কিটি

26

সবচেয়ে বড় সমস্যাটি হ'ল জাভা জেনেরিকগুলি কেবল একটি সংকলনযুক্ত জিনিস এবং আপনি রান-টাইমে এটিকে বিকৃত করতে পারেন। সি # প্রশংসিত কারণ এটি আরও রান-টাইম চেকিং করে। এই পোস্টে কিছু সত্যিই ভাল আলোচনা আছে , এবং এটি অন্যান্য আলোচনার লিঙ্ক।


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

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

1
@ ভিনসেন্ট ক্যান্টিন - এটি অবশ্যই একটি সমস্যা। সুতরাং, আমরা সবাই এটি সম্পর্কে অভিযোগ করছি ining জাভা জেনেরিকগুলি অর্ধ-বেকড।
জোশ এম

17

মূল সমস্যাটি হচ্ছে জাভাতে রানটাইমের সময় আসলে জেনারিক নেই। এটি একটি সংকলন সময় বৈশিষ্ট্য।

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

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

পার্থক্যগুলির এখানে দুর্দান্ত সংক্ষিপ্ত বিবরণ: http://www.jprl.com/Blog/archive/development/2007/Aug-31.html


2
আপনি কেন নিচে ভোট পেয়েছিলেন তা আমি নিশ্চিত নই। আমি যা বুঝতে পেরেছি তা থেকে আপনি সঠিক, এবং সেই লিঙ্কটি খুব তথ্যপূর্ণ। আপ-ভোট দিয়েছে।
জেসন জ্যাকসন

@ জেসন, ধন্যবাদ আমার আসল সংস্করণে একটি টাইপো ছিল, আমি অনুমান করি যে আমি এটির জন্য নিম্নচোটিত ছিলাম।
জারেডপাড়

3
ত্রুটি, কারণ আপনি জেনেরিক ধরণ, একটি জেনেরিক পদ্ধতির স্বাক্ষর দেখার জন্য প্রতিবিম্বটি ব্যবহার করতে পারেন। প্যারামাইট্রাইজড দৃষ্টান্তের সাথে সম্পর্কিত জেনেরিক তথ্য পরিদর্শন করতে আপনি কেবল প্রতিচ্ছবি ব্যবহার করতে পারবেন না। উদাহরণস্বরূপ, যদি আমার কাছে
মেথু

প্রচুর নিবন্ধ রয়েছে যা টাইপ মোছা বলে দেয় প্রকৃত ধরণের পরামিতিগুলি খুঁজে পাওয়া অসম্ভব। বলুন: অবজেক্ট এক্স = নতুন এক্স [ওয়াই] (); আপনি কীভাবে x টি দিয়ে Y টাইপটি সন্ধান করতে পারেন?
ব্যবহারকারী 48956

@ অক্সবো_লাক্স - জেনেরিক ধরণের সন্ধানের জন্য প্রতিবিম্বটি ব্যবহার করা এটি করতে সক্ষম না হওয়ায় প্রায় খারাপ। যেমন এটি একটি খারাপ সমাধান।
জোশ এম

14
  1. রানটাইম বাস্তবায়ন (যেমন মুছে ফেলা টাইপ নয়);
  2. আদিম ধরণের ব্যবহারের ক্ষমতা (এটি সম্পর্কিত (1));
  3. ওয়াইল্ডকার্ডিং সিনট্যাক্সের জন্য দরকারী এবং কখন এটি ব্যবহার করবেন তা জেনে রাখা এমন কিছু যা প্রচুর লোককে আটকায়। এবং
  4. কোনও পারফরম্যান্স উন্নতি হয়নি (কারণ (1); জাভা জেনেরিকগুলি কাস্টিংগি অবজেক্টগুলির জন্য সিনট্যাকটিক চিনি)।

(1) কিছু খুব অদ্ভুত আচরণ বাড়ে। আমি এর সেরা উদাহরণটি ভাবতে পারি। ধরে:

public class MyClass<T> {
  T getStuff() { ... }
  List<String> getOtherStuff() { ... }
}

তারপরে দুটি ভেরিয়েবল ঘোষণা করুন:

MyClass<T> m1 = ...
MyClass m2 = ...

এখন কল করুন getOtherStuff():

List<String> list1 = m1.getOtherStuff(); 
List<String> list2 = m2.getOtherStuff(); 

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

আমি জেডিকে থেকে আমার প্রিয় ঘোষণার কথাও উল্লেখ করব:

public class Enum<T extends Enum<T>>

ওয়াইল্ডকার্ডিং (যা একটি মিশ্র ব্যাগ) ছাড়াও আমার মনে হয়। নেট জেনেরিকগুলি আরও ভাল।


তবে সংকলকটি আপনাকে বিশেষত কাঁচা টাইপের লিঙ্ক বিকল্পটি বলবে।
টম হাটিন - 6:58

দুঃখিত, শেষ লাইনটি একটি সংকলন ত্রুটি কেন? আমি এটিকে গ্রহগ্রহে নিয়ে ঘোরাঘুরি করছি এবং এটি এখানে ব্যর্থ হতে পারি না - যদি আমি বাকী অংশগুলিকে সংকলনের জন্য পর্যাপ্ত জিনিস যোগ করি তবে।
oconnor0

public class Redundancy<R extends Redundancy<R>>;)
java.is.for.desktop

@ oconnor0 এটি কোনও সংকলন ব্যর্থতা নয়, কোনও The expression of type List needs unchecked conversion to conform to List<String>
সংঘবদ্ধ

Enum<T extends Enum<T>>প্রথমে অদ্ভুত / অপ্রয়োজনীয় মনে হতে পারে তবে কমপক্ষে জাভা / এর জেনেরিকের সীমাবদ্ধতার মধ্যে এটি বেশ আকর্ষণীয়। এনামগুলির কাছে এনাম values()হিসাবে টাইপ করা উপাদানগুলির একটি অ্যারে দেওয়ার একটি স্ট্যাটিক পদ্ধতি রয়েছে Enumএবং এটি টাইপ জেনেরিক পরামিতি দ্বারা নির্ধারিত হয়, যার অর্থ আপনি চান Enum<T>। অবশ্যই, সেই টাইপিংটি কেবল একটি গণনা করা প্রকারের প্রসঙ্গেই উপলব্ধি করে এবং সমস্ত এনামগুলি সাবক্লাস হয় Enum, সুতরাং আপনি চান Enum<T extends Enum>। তবে জাভা জেনেরিকের সাথে কাঁচা ধরণের মিশ্রণ পছন্দ করে না, এভাবে Enum<T extends Enum<T>>ধারাবাহিকতার জন্য।
জাব

10

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

Map someMap;

এখন, আমি এটি হিসাবে ঘোষণা করতে হবে

Map<String, List<String>> someMap;

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

জাভা ইতিমধ্যে প্রচলিত ব্যবহারের মধ্যে সবচেয়ে ভার্বোজ ভাষা হওয়ায় একটি খারাপ খ্যাতি রয়েছে এবং জেনারিকরা কেবল সেই সমস্যাটিতে যুক্ত করে।

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

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

List someList = someMap.get("some key");

আমাকে করতে হবে

List someList = (List) someMap.get("some key");

অবশ্যই কারণটি হ'ল get () কোনও অবজেক্ট দেয় যা তালিকার একটি সুপার টাইপ। সুতরাং অ্যাসাইনমেন্টটি টাইপকাস্ট ছাড়া করা যাবে না। আবার, সেই নিয়ম আপনাকে সত্যিকার অর্থে কতটা কিনে তা ভেবে দেখুন। আমার অভিজ্ঞতা থেকে, খুব বেশি না।

আমি মনে করি জাভা যদি আরও ভাল হত তবে 1) এটি জেনেরিক যুক্ত না করে 2) পরিবর্তে একটি সুপার টাইপ থেকে সাব টাইপে অন্তর্নিহিত কাস্টিংয়ের অনুমতি দিত। রানটাইমের সময় ভুল ক্যাসেটগুলি ধরা যাক। তারপরে আমি সংজ্ঞায়নের সরলতা পেতে পারি

Map someMap;

এবং পরে করছেন

List someList = someMap.get("some key");

সমস্ত ক্রাফট চলে যাবে এবং আমি সত্যিই মনে করি না যে আমি আমার কোডে কোনও বড় বাগের উত্স প্রবর্তন করব।


15
দুঃখিত, আপনি যা বলেছেন তার সাথে আমি একমত নই। তবে আমি এটিকে ভোট দিতে যাচ্ছি না কারণ আপনি এটি ভালভাবে বিতর্ক করেছেন।
পল টম্বলিন

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

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

4
"এবং এই অতিরিক্ত অতিরিক্ত ভারবোসিটির জন্য আপনি সত্যই কী কিনবেন? ..." এটি এই সংগ্রহগুলিতে খারাপ থাকার রক্ষণাবেক্ষণ প্রোগ্রামারকে বলে। আমি এটি বাণিজ্যিক জাভা অ্যাপ্লিকেশনগুলির সাথে কাজ করার একটি সমস্যা বলে মনে করেছি।
richj

4
"কেউ সত্যিই কতবার সমস্যা হয়েছে যেখানে কেউ [x] একটি সংগ্রহের মধ্যে [y] রাখার কথা বলেছিলেন?" - ওরে ছেলে আমি গণনা হারিয়ে ফেলেছি! তবুও কোনও বাগ না থাকলেও এটি পঠনযোগ্যতা হত্যাকারী। এবং অবজেক্টটি কী হতে চলেছে তা (বা ডিবাগিং) সত্যই জোন থেকে আমাকে টানতে পারে তা জানতে অনেকগুলি ফাইল স্ক্যান করে। আপনি হাস্কেল পছন্দ করতে পারেন - এমনকি শক্ত টাইপিং তবে কম ক্রাফ্ট (কারণ প্রকারগুলি অনুমান করা হয়)।
মার্টিন ক্যাপোডিসি

8

এগুলির আর একটি পার্শ্ব প্রতিক্রিয়া হ'ল সংকলন-সময় এবং রান সময় না হ'ল আপনি জেনেরিক ধরণের কনস্ট্রাক্টরকে কল করতে পারবেন না। সুতরাং আপনি এগুলি জেনেরিক কারখানাটি প্রয়োগ করতে ব্যবহার করতে পারবেন না ...


   public class MyClass {
     public T getStuff() {
       return new T();
     }
    }

--jeffk ++,


6

জাভা জেনেরিকগুলি সংকলনের সময় নির্ভুলতার জন্য পরীক্ষা করা হয় এবং তারপরে সমস্ত প্রকারের তথ্য মুছে ফেলা হয় (প্রক্রিয়াটিকে টাইপ ইরেজর বলা হয় Thus সুতরাং, জেনেরিকটি List<Integer>তার কাঁচা প্রকারে কমিয়ে দেওয়া হবে , নন-জেনেরিকList , যা স্বেচ্ছাসেবী শ্রেণীর অবজেক্টগুলি ধারণ করতে পারে।

এটি রানটাইমের সময় তালিকায় স্বেচ্ছাচারিত বস্তু সন্নিবেশ করতে সক্ষম হওয়ার ফলস্বরূপ, এখন জেনেরিক পরামিতি হিসাবে কী ধরণের ব্যবহৃত হত তা বলা এখন অসম্ভব। পরের ফলাফল ফলাফল

ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if(li.getClass() == lf.getClass()) // evaluates to true
  System.out.println("Equal");

5

আমি ইচ্ছা করি এটি একটি উইকি ছিল যাতে আমি অন্য লোকের সাথে যুক্ত করতে পারি ... তবে ...

সমস্যা:

  • টাইপ ইরেজ (কোনও রানটাইম উপলভ্য নয়)
  • প্রাথমিক প্রকারের জন্য কোনও সমর্থন নেই
  • টীকাগুলির সাথে অসঙ্গতি (এগুলি দু'এই 1.5 তে যুক্ত করা হয়েছিল আমি এখনও নিশ্চিত নই কেন টীকাগুলি জেনারিকদের বৈশিষ্ট্যগুলিতে ছুটে যাওয়ার অনুমতি দেয় না)
  • অ্যারেগুলির সাথে অসঙ্গতি। (কখনও কখনও আমি সত্যিই ক্লাসের মতো কিছু করতে চাই <? মাইবজেক্টটি প্রসারিত করে> [] , তবে আমার অনুমতি নেই)
  • উইয়ার্ড ওয়াইল্ডকার্ড বাক্য গঠন এবং আচরণ
  • জেনেরিক সমর্থন জাভা ক্লাসে অসামঞ্জস্যপূর্ণ এই বিষয়টি। তারা এটিকে বেশিরভাগ সংগ্রহের পদ্ধতিতে যুক্ত করেছে, তবে প্রতি একবারে একবারে আপনি এমন নজরে চলে যান যেখানে এটি নেই।

5

পুরো প্রকারের ক্ষয়জনিত জঞ্জাল উপেক্ষা করা, জেনারিকগুলি নির্দিষ্ট হিসাবে কেবল কাজ করে না।

এটি সংকলন:

List<Integer> x = Collections.emptyList();

তবে এটি একটি সিনট্যাক্স ত্রুটি:

foo(Collections.emptyList());

Foo যেখানে সংজ্ঞায়িত হয়েছে:

void foo(List<Integer> x) { /* method body not important */ }

সুতরাং কোনও এক্সপ্রেশন প্রকারের চেকগুলি স্থানীয় ভেরিয়েবলকে নির্ধারিত করা হচ্ছে বা কোনও পদ্ধতি কলের প্রকৃত প্যারামিটারের উপর নির্ভর করে কিনা। এ কেমন পাগল?


3
জাভাক দ্বারা অসামঞ্জস্যপূর্ণ অনুচ্ছেদে হ'ল বোকা।
এমপি।

3
আমি ধরে নেব যে পরবর্তী ফর্মটি প্রত্যাখ্যান করার কারণটি কারণ পদ্ধতি ওভারলোডিংয়ের কারণে "ফু" এর একাধিক সংস্করণ থাকতে পারে।
জেসন ক্রেইটন

2
এই সমালোচনাটি আর প্রয়োগ হয় না কারণ জাভা 8 উন্নত লক্ষ্য-ধরণের
অনুক্রমের

4

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

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


3

জাভা রান সময় জেনেরিক্স প্রয়োগ করে না, শুধুমাত্র সংকলন সময়।

এর অর্থ হ'ল জেনেরিক সংগ্রহগুলিতে আপনি ভুল ধরণের যুক্ত করার মতো আকর্ষণীয় কাজ করতে পারেন।


1
সংকলক আপনাকে বলবে যে আপনি যদি এটি পরিচালনা করেন তবে আপনি খারাপ হয়ে গেছেন।
টম হাটিন - 6:58

@ টম - অগত্যা নয়। সংকলক বোকা উপায় আছে।
পল টমলিন

2
সংকলক আপনাকে যা বলে তা আপনি শুনছেন না ?? (আমার প্রথম মন্তব্য দেখুন)
টম হাটিন - 15-15

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

1
স্ট্যাটিক অকার্যকর addToList (তালিকার তালিকা) {list.add (1); <তালিকা <স্ট্রিং> তালিকা = নতুন অ্যারেলিস্ট <স্ট্রিং> (); addToList (তালিকা); এটি সংকলন করে, এমনকি রানটাইমেও কাজ করে। আপনি যখন স্ট্রিংয়ের প্রত্যাশা তালিকা থেকে সরিয়েছেন এবং কোনও int পেয়ে থাকেন তখনই আপনি কেবল একবার সমস্যা দেখেন।
ল্যাপলি অ্যান্ডারসন

3

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


2

আপনি যদি জাভা পোস্ট # 279 শুনেন - জো ডারসি এবং অ্যালেক্স বাকলির সাথে সাক্ষাত্কার , তারা এই সমস্যাটি নিয়ে কথা বলে। এটি জাভা জন্য রিফাইড জেনারিকস শিরোনামে একটি নিল গিফের্ট ব্লগ পোস্টের সাথেও লিঙ্ক করেছে যা বলে:

জাভাতে জেনেরিকগুলি যেভাবে প্রয়োগ করা হয় তার ফলে সৃষ্ট বিধিনিষেধের সাথে অনেক লোক অসন্তুষ্ট। বিশেষত, তারা অসন্তুষ্ট যে জেনেরিক ধরণের পরামিতিগুলি পুনরায় সংশোধিত হয় না: রানটাইম এ সেগুলি উপলভ্য নয়। জেনেরিকগুলি ক্ষয় ব্যবহার করে প্রয়োগ করা হয়, যার মধ্যে জেনেরিক ধরণের পরামিতিগুলি রানটাইমগুলিতে কেবল সরানো হয়।

এই ব্লগ পোস্টটি, পুরানো এন্ট্রিটি উল্লেখ করে, ইরেজারের মাধ্যমে ধাঁধা: উত্তর বিভাগ , যা প্রয়োজনীয়তার মধ্যে মাইগ্রেশন সামঞ্জস্যতার বিষয়ে জোর দিয়েছিল ।

লক্ষ্যটি ছিল উত্স এবং অবজেক্ট কোড উভয়েরই পিছনের দিকের সামঞ্জস্যতা এবং মাইগ্রেশন সামঞ্জস্য।

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