জাভা জেনেরিকের ধরণ মুছে ফেলা: কখন এবং কী ঘটে?


237

আমি ওরাকলের ওয়েবসাইটে জাভা প্রকারের মুছে ফেলার বিষয়ে পড়ি ।

টাইপ ক্ষয় কখন ঘটে? সংকলন সময় বা রানটাইম এ? ক্লাস বোঝা হয় কখন? ক্লাস কবে ইনস্ট্যান্ট হয়?

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

নিম্নলিখিত উদাহরণটি বিবেচনা করুন: বলুন শ্রেণীর Aএকটি পদ্ধতি আছে empty(Box<? extends Number> b),। আমরা A.javaক্লাস ফাইলটি সংকলন করি এবং পাই A.class

public class A {
    public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}

এখন আমরা অন্য বর্গ তৈরি Bযা পদ্ধতি ডাকে emptyএকটি অ-স্থিতিমাপ যুক্তি (কাঁচা টাইপ) ঃ empty(new Box())। আমরা যদি কম্পাইল B.javaসঙ্গে A.classক্লাসপাথ এ, javac স্মার্ট যথেষ্ট একটি সতর্কবার্তা বাড়াতে হয়। তাই A.class হয়েছে এটা সঞ্চিত কিছু টাইপ করুন।

public class B {
    public static void invoke() {
        // java: unchecked method invocation:
        //  method empty in class A is applied to given types
        //  required: Box<? extends java.lang.Number>
        //  found:    Box
        // java: unchecked conversion
        //  required: Box<? extends java.lang.Number>
        //  found:    Box
        A.empty(new Box());
    }
}

আমার অনুমানটি ক্লাসটি লোড হওয়ার পরে ধরণের ক্ষয় ঘটে, তবে এটি কেবল অনুমান। তাহলে কখন হয়?


2
এই প্রশ্নের একটি আরো "Generic" সংস্করণ: stackoverflow.com/questions/313584/...
সিরো Santilli郝海东冠状病六四事件法轮功

@ ফাইরিপিং: আমার উত্তরে উল্লিখিত নিবন্ধটি কীভাবে এবং কখন ক্ষয় ঘটে তা বিস্তারিতভাবে ব্যাখ্যা করে। টাইপ তথ্য কখন রাখা হয় তাও এটি ব্যাখ্যা করে। অন্য কথায়: জাভাতে রিফাইড জেনেরিকগুলি উপলব্ধ, বিস্তৃত বিশ্বাসের বিপরীতে। দেখুন: rgomes.info/using-typetokens-to-retrieve-generic-paraters
রিচার্ড গোমেস

উত্তর:


240

প্রকার মুছে ফেলা জেনেরিকের ব্যবহারের ক্ষেত্রে প্রযোজ্য । সেখানে স্পষ্টভাবে মেটাডেটা ক্লাস ফাইল বলতে থাকুক বা না থাকুক একটি পদ্ধতি / ধরনের হয় জেনেরিক, এবং কি সীমাবদ্ধতার ইত্যাদি হয় কিন্তু যখন জেনেরিক্স হয় ব্যবহৃত , তারা কম্পাইল-টাইম চেক এবং সঞ্চালনের সময় কাস্ট রূপান্তরিত করছি। সুতরাং এই কোড:

List<String> list = new ArrayList<String>();
list.add("Hi");
String x = list.get(0);

সংকলিত হয়

List list = new ArrayList();
list.add("Hi");
String x = (String) list.get(0);

কার্যকর করার সময় T=Stringতালিকার অবজেক্টের জন্য এটি সন্ধানের কোনও উপায় নেই - সেই তথ্য চলে গেছে information

... তবে List<T>ইন্টারফেস নিজেই নিজেকে জেনেরিক বলে বিজ্ঞাপন দেয়।

সম্পাদনা করুন: শুধু নির্মল, কম্পাইলার সম্পর্কে তথ্য ধরে রাখা আছে পরিবর্তনশীল একটি হচ্ছে List<String>- কিন্তু আপনি এখনও অপরাজিত খুঁজে পেতে পারে T=Stringতালিকা বস্তুর নিজেই জন্য।


6
না, এমনকি জেনেরিক টাইপের ব্যবহারে রানটাইমের সময় মেটাডেটা থাকতে পারে। একটি স্থানীয় ভেরিয়েবল প্রতিবিম্বের মাধ্যমে অ্যাক্সেসযোগ্য নয়, তবে "তালিকা <স্ট্রিং> এল" হিসাবে ঘোষিত একটি পদ্ধতির প্যারামিটারের জন্য রানটাইমে টাইপ মেটাডেটা থাকবে, প্রতিবিম্ব এপিআইয়ের মাধ্যমে উপলব্ধ। হ্যাঁ, "টাইপ ইরেজোর" এতটা সহজ নয় যতটা অনেকে ভাবেন ...
রোজারিও

4
@ রোজারিও: আমি আপনার মন্তব্যে জবাব দেওয়ার সাথে সাথে আমি বিশ্বাস করি যে আপনি ভেরিয়েবলের ধরণ পেতে সক্ষম হয়ে কোনও বস্তুর ধরণ পেতে সক্ষম হওয়ার মধ্যে বিভ্রান্ত হচ্ছেন । ক্ষেত্রটি সত্ত্বেও বস্তুটি নিজের প্রকারের আর্গুমেন্টটি নিজেই জানে না।
জন স্কিটি

অবশ্যই, কেবল অবজেক্টের দিকে তাকানো আপনি জানেন না যে এটি একটি তালিকা <স্ট্রিং>। কিন্তু বস্তুগুলি কোথাও থেকে প্রদর্শিত হয় না। এগুলি স্থানীয়ভাবে তৈরি করা হয়, পদ্ধতি আহ্বানের আর্গুমেন্ট হিসাবে পাস করা হয়, কোনও পদ্ধতি কল থেকে রিটার্ন মান হিসাবে প্রত্যাবর্তন করা হয় বা কোনও কোনও বস্তুর ক্ষেত্র থেকে পড়া হয় ... এই সমস্ত ক্ষেত্রে আপনি রান টাইমে জেনেরিক ধরনটি কী তা জানতে পারবেন, হয় হয় স্পষ্টতই বা জাভা প্রতিবিম্ব API ব্যবহার করে।
Rogério

13
@ রোজারিও: আপনি কীভাবে জানবেন যে যদিও বস্তুটি কোথা থেকে এসেছে? আপনার যদি টাইপের একটি প্যারামিটার থাকে তবে আপনি List<? extends InputStream>কীভাবে জানবেন যে এটি তৈরি হওয়ার সময় এটি কী ধরণের ছিল? এমনকি আপনি যদি ক্ষেত্রের ধরণের রেফারেন্সটি সঞ্চিত রেখেছেন তা জানতে পারেন তবে আপনার কেন দরকার? কার্যকর করার সময় আপনি কেন বস্তুটি সম্পর্কে সমস্ত তথ্য পেতে সক্ষম হবেন, তবে এর জেনেরিক ধরণের আর্গুমেন্টগুলি নয়? আপনি এই ক্ষুদ্র জিনিসটি যা সত্যিই বিকাশকারীদেরকে প্রভাবিত করে না বলে প্রকারভেদ মুছে ফেলার চেষ্টা করছেন বলে মনে করছেন - যেখানে আমি এটি বেশিরভাগ ক্ষেত্রেই খুব উল্লেখযোগ্য সমস্যা বলে মনে করি।
জন স্কিটি

তবে মুছে ফেলা টাইপ একটি ক্ষুদ্র জিনিস যা সত্যই বিকাশকারীদের প্রভাবিত করে না! অবশ্যই, আমি অন্যের পক্ষে কথা বলতে পারি না, তবে আমার অভিজ্ঞতায় এটি কখনও বড় বিষয় ছিল না। আমি আমার জাভা মকিং এপিআই (জেমকিত) এর ডিজাইনে রানটাইম টাইপের তথ্যের সদ্ব্যবহার করি; হাস্যকরভাবে, .NET উপহাস এপিআইগুলি সি # তে উপলব্ধ জেনেরিক টাইপ সিস্টেমের কম সুবিধা গ্রহণ করবে বলে মনে হচ্ছে।
Rogério

99

সংকলক সংকলন সময়ে জেনারিকস বোঝার জন্য দায়ী। আমরা যে প্রক্রিয়াটিতে ডেকে আছি, জেনেরিক ক্লাসগুলির এই "বোঝাপড়া" ছুঁড়ে দেওয়ার জন্যও সংকলক দায়বদ্ধ টাইপ ইরেজিওর । সমস্ত সংকলন সময়ে ঘটে।

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

প্রকার মুছে ফেলার বিষয়ে

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

জাভার রিফাইড জেনেরিকগুলি সম্পর্কে

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

আমি এই বিষয়ে একটি নিবন্ধ লিখেছি:

https://rgomes.info/using-typetokens-to-retrieve-generic-parameters/

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

কোডের উদাহরণ

উপরের নিবন্ধটিতে নমুনা কোডের লিঙ্ক রয়েছে।


1
@ উইল ৮৪৪: আমি উত্তরটি ব্যাপকভাবে উন্নত করেছি এবং কিছু পরীক্ষার ক্ষেত্রে একটি লিঙ্ক যুক্ত করেছি। চিয়ার্স :)
রিচার্ড গোমেস

1
প্রকৃতপক্ষে, তারা বাইনারি এবং উত্স উভয়ই সামঞ্জস্যতা বজায় রাখেনি : oracle.com/technetwork/java/javase/compatibility-137462.html তাদের উদ্দেশ্য সম্পর্কে আমি আরও কোথায় পড়তে পারি? দস্তাবেজগুলি বলে যে এটি প্রকার ক্ষয় ব্যবহার করে তবে কেন তা বলে না।
ডিজিট্রি লেজারকা

@ রিচার্ড সত্যই, দুর্দান্ত নিবন্ধ! আপনি যোগ করতে পারেন যে স্থানীয় ক্লাসগুলিও কাজ করে এবং উভয় ক্ষেত্রেই (বেনামে এবং স্থানীয় শ্রেণিগুলি), new Box<String>() {};অপ্রত্যক্ষ অ্যাক্সেসের ক্ষেত্রে সরাসরি অ্যাক্সেস না হলে কাঙ্ক্ষিত ধরণের আর্গুমেন্ট সম্পর্কিত void foo(T) {...new Box<T>() {};...}তথ্য রাখা হয় কারণ সংকলক এতে টাইপ তথ্য রাখে না বদ্ধকরণ পদ্ধতি ঘোষণা।
ইয়ান-গাল গুহানিয়ুক

আমি আমার নিবন্ধের একটি ভাঙা লিঙ্ক স্থির করেছি। আমি আস্তে আস্তে আমার জীবনকে ডি-গুগল করছি এবং আমার ডেটা পুনরায় দাবি করছি। :-)
রিচার্ড গোমেস

33

আপনার যদি এমন একটি ক্ষেত্র থাকে যা জেনেরিক ধরণের হয় তবে এর ধরণের পরামিতিগুলি ক্লাসে সংকলিত হয়।

আপনার যদি এমন একটি পদ্ধতি থাকে যা জেনেরিক প্রকারটি গ্রহণ করে বা ফেরত দেয় তবে সেই ধরণের পরামিতিগুলি ক্লাসে সংকলিত হয়।

এই তথ্যটি এই সংকলকটি Box<String>আপনাকে কীভাবে empty(Box<T extends Number>)পদ্ধতিতে পাস করতে পারে না তা জানাতে ব্যবহার করে।

এপিআই জটিল, কিন্তু আপনি মত পদ্ধতি প্রতিফলন API এর মাধ্যমে এই ধরনের তথ্য পরিদর্শন করতে পারেন getGenericParameterTypes, getGenericReturnType, এবং, ক্ষেত্রের জন্য, getGenericType

আপনার যদি এমন জেনেরিক টাইপ ব্যবহার করে এমন কোড থাকে তবে সংকলক প্রকারগুলি পরীক্ষা করার জন্য প্রয়োজনীয়তার সাথে কাস্টার সন্নিবেশ করায় (কলারে)। জেনেরিক বস্তুগুলি এগুলি কেবল কাঁচা টাইপ; প্যারামিটারাইজড টাইপটি "মুছে ফেলা" হয়। সুতরাং, আপনি যখন একটি তৈরি করেন, অবজেক্টে শ্রেণি new Box<Integer>()সম্পর্কে কোনও তথ্য নেই ।IntegerBox

অ্যাঞ্জেলিকা ল্যাঙ্গারের FAQ আমি জাভা জেনেরিক্সের জন্য সবচেয়ে ভাল রেফারেন্স দেখেছি।


2
প্রকৃতপক্ষে, এটি ক্ষেত্র এবং পদ্ধতিগুলির আনুষ্ঠানিক জেনেরিক ধরণের যা ক্লাসে সংকলিত হয়, অর্থাত্, "T" টিপিক্যাল। প্রাপ্ত করতে বাস্তব জেনেরিক ধরণ, আপনি ব্যবহার করা আবশ্যক "বেনামী ক্লাসের কৌতুক"
ইয়ান-গাল গুহানিয়ুক

13

জাভা ভাষার জেনারিক্স এই বিষয়টির পক্ষে সত্যই একটি ভাল গাইড।

জেনারিকস জাভা সংকলক দ্বারা ইরেজোর নামে একটি ফ্রন্ট-এন্ড রূপান্তর হিসাবে প্রয়োগ করা হয়। আপনি এটি প্রায় উত্স-উত্স অনুবাদ হিসাবে ভাবতে পারেন, যার জেনেরিক সংস্করণটি loophole()নন-জেনেরিক সংস্করণে রূপান্তরিত হয়েছে।

সুতরাং, এটি সংকলন সময়ে। ArrayListআপনি কোনটি ব্যবহার করেছেন তা জেভিএম কখনই জানতে পারবে না ।

আমি জাভাতে জেনেরিকের ক্ষয়ের ধারণাটি কী তা নিয়ে মিঃ স্কিটের জবাবটিও সুপারিশ করব ?


6

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

Box<String> b = new Box<String>();
String x = b.getDefault();

রূপান্তরিত হয়

Box b = new Box();
String x = (String) b.getDefault();

সংকলন সময়ে। আপনি সতর্কতা পেতে পারেন না কারণ সংকলকটি জেনেরিক কী ধরণের তা সম্পর্কে জানে তবে বিপরীতে, কারণ এটি যথেষ্ট জানেন না তাই এটি টাইপ সুরক্ষার গ্যারান্টি দিতে পারে না।

অতিরিক্তভাবে, সংকলকটি কোনও মেথড কলের পরামিতিগুলি সম্পর্কে টাইপ তথ্য ধরে রাখে, যা আপনি প্রতিবিম্বের মাধ্যমে পুনরুদ্ধার করতে পারেন।

এই গাইডটি আমি বিষয়টিতে সর্বাধিক খুঁজে পেয়েছি।


6

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

আপনি ঘৃণা করার আগে দয়া করে উইকি থেকে মুছে ফেলার সঠিক সংজ্ঞাটি প্রত্যাহার করুন

টাইপ ইরেজোর কী?

প্রকার মুছে ফেলা লোড-টাইম প্রক্রিয়াটিকে বোঝায় যা দ্বারা চালিত সময়ে কার্যকর হওয়ার আগে কোনও প্রোগ্রাম থেকে সুস্পষ্ট প্রকারের টীকাগুলি সরিয়ে ফেলা হয়

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

সুতরাং এটি ফিরতি, একটি স্বাভাবিক প্রাকৃতিক জিনিস।

জাভার সমস্যাটি আলাদা এবং এটি কীভাবে পুনরায় সংঘটিত হয় তার কারণ।

জাভা সম্পর্কে প্রায়শই দেওয়া বিবৃতিগুলিতে রিফাইড জেনারিক থাকে না তাও ভুল।

জাভা সংশোধন করে তবে পিছনে সামঞ্জস্যের কারণে একটি ভুল উপায়ে।

সংশোধন কী?

আমাদের উইকি থেকে

রেফারেশন হল এমন একটি প্রক্রিয়া যার মাধ্যমে একটি কম্পিউটার প্রোগ্রাম সম্পর্কে একটি বিমূর্ত ধারণা একটি স্পষ্ট ডেটা মডেল বা কোনও প্রোগ্রামিং ভাষায় তৈরি অন্যান্য অবজেক্টে রূপান্তরিত হয়।

রিফাইজেশন বলতে কিছু বিমূর্ত (প্যারামেট্রিক টাইপ) কে বিশেষায়িত করে কংক্রিটের (কংক্রিটের ধরণ) রূপান্তর করা।

আমরা একটি সাধারণ উদাহরণ দ্বারা এটি ব্যাখ্যা:

সংজ্ঞা সহ একটি অ্যারেলিস্ট:

ArrayList<T>
{
    T[] elems;
    ...//methods
}

একটি বিমূর্ততা, বিশদভাবে একটি প্রকার নির্মাতা, যা কংক্রিটের সাথে বিশেষীকরণের পরে "পুনরায় সংশোধিত" হয়ে যায়, পূর্ণসংখ্যা বলে:

ArrayList<Integer>
{
    Integer[] elems;
}

ArrayList<Integer>সত্যিই যেখানে একটি টাইপ।

তবে জাভা যা করেন না ঠিক এই জিনিসটি !!! পরিবর্তে, তারা তাদের সীমানা সহ ক্রমাগত বিমূর্ত প্রকারগুলি সংশোধন করে, অর্থাত্ বিশেষায়নের জন্য প্রদত্ত প্যারামিটারগুলির চেয়ে পৃথক একই কংক্রিট প্রকারের উত্পাদন করে:

ArrayList
{
    Object[] elems;
}

যা এখানে অন্তর্নিহিত বাউন্ড অবজেক্ট ( ArrayList<T extends Object>== ArrayList<T>) দিয়ে সংশোধিত হয়েছে ।

তা সত্ত্বেও এটি জেনেরিক অ্যারেগুলি অকেজো করে তোলে এবং কাঁচা ধরণের জন্য কিছু অদ্ভুত ত্রুটি ঘটায়:

List<String> l= List.<String>of("h","s");
List lRaw=l
l.add(new Object())
String s=l.get(2) //Cast Exception

এটি হিসাবে অস্পষ্টতা অনেক কারণ

void function(ArrayList<Integer> list){}
void function(ArrayList<Float> list){}
void function(ArrayList<String> list){}

একই ফাংশন পড়ুন:

void function(ArrayList list)

এবং তাই জেনেরিক পদ্ধতি ওভারলোডিং জাভাতে ব্যবহার করা যাবে না।


2

আমি অ্যান্ড্রয়েডে মুছে ফেলার ধরণের মুখোমুখি হয়েছি। উত্পাদনে আমরা মিনিফল বিকল্প সহ গ্রেডেল ব্যবহার করি। ক্ষুদ্রাকরণের পরে আমি মারাত্মক ব্যতিক্রম পেয়েছি। আমি আমার অবজেক্টের উত্তরাধিকার শৃঙ্খলা প্রদর্শনের জন্য সাধারণ কাজ করেছি:

public static void printSuperclasses(Class clazz) {
    Type superClass = clazz.getGenericSuperclass();

    Log.d("Reflection", "this class: " + (clazz == null ? "null" : clazz.getName()));
    Log.d("Reflection", "superClass: " + (superClass == null ? "null" : superClass.toString()));

    while (superClass != null && clazz != null) {
        clazz = clazz.getSuperclass();
        superClass = clazz.getGenericSuperclass();

        Log.d("Reflection", "this class: " + (clazz == null ? "null" : clazz.getName()));
        Log.d("Reflection", "superClass: " + (superClass == null ? "null" : superClass.toString()));
    }
}

এবং এই ফাংশনটির দুটি ফলাফল রয়েছে:

মাইনাইফড কোড নয়:

D/Reflection: this class: com.example.App.UsersList
D/Reflection: superClass: com.example.App.SortedListWrapper<com.example.App.Models.User>

D/Reflection: this class: com.example.App.SortedListWrapper
D/Reflection: superClass: android.support.v7.util.SortedList$Callback<T>

D/Reflection: this class: android.support.v7.util.SortedList$Callback
D/Reflection: superClass: class java.lang.Object

D/Reflection: this class: java.lang.Object
D/Reflection: superClass: null

সংক্ষিপ্ত কোড:

D/Reflection: this class: com.example.App.UsersList
D/Reflection: superClass: class com.example.App.SortedListWrapper

D/Reflection: this class: com.example.App.SortedListWrapper
D/Reflection: superClass: class android.support.v7.g.e

D/Reflection: this class: android.support.v7.g.e
D/Reflection: superClass: class java.lang.Object

D/Reflection: this class: java.lang.Object
D/Reflection: superClass: null

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

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