টিএল; ডিআর, এটি একটি সংকলক বাগ।
উত্তরাধিকার সূত্রে প্রাপ্ত বা কোনও ডিফল্ট পদ্ধতিতে কোনও প্রয়োগযোগ্য পদ্ধতিতে অগ্রাধিকার দেওয়ার কোনও নিয়ম নেই। মজার বিষয় হল, যখন আমি কোডটি পরিবর্তন করি
interface ConsumerOne<T> {
void accept(T a);
}
interface ConsumerTwo<T> {
void accept(T a);
}
interface CustomIterable<T> extends Iterable<T> {
void forEach(ConsumerOne<? super T> c); //overload
void forEach(ConsumerTwo<? super T> c); //another overload
}
iterable.forEach((A a) -> aList.add(a));বিবৃতি অন্ধকার একটি ত্রুটি উৎপন্ন হয়।
যেহেতু কোন সম্পত্তি forEach(Consumer<? super T) c)Iterable<T> ইন্টারফেস থেকে পদ্ধতির অন্য ওভারলোড ঘোষণার সময় পরিবর্তিত হয়নি, তাই Eclipse এর এই পদ্ধতিটি নির্বাচন করার সিদ্ধান্ত পদ্ধতির কোনও সম্পত্তির উপর ভিত্তি করে (ধারাবাহিকভাবে) হতে পারে না। এটি এখনও একমাত্র উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতি, এখনও একমাত্র defaultপদ্ধতি, এখনও একমাত্র জেডিকে পদ্ধতি এবং অন্যান্য। এই বৈশিষ্ট্যগুলির মধ্যে যে কোনওভাবেই পদ্ধতি নির্বাচনকে প্রভাবিত করা উচিত নয়।
দ্রষ্টব্য যে ঘোষণাটি পরিবর্তন করে
interface CustomIterable<T> {
void forEach(ConsumerOne<? super T> c);
default void forEach(ConsumerTwo<? super T> c) {}
}
এছাড়াও একটি "দ্ব্যর্থক" ত্রুটি তৈরি করে, তাই প্রয়োগযোগ্য ওভারলোডেড পদ্ধতির সংখ্যাটি কোনও বিষয় নয়, এমনকি কেবলমাত্র দুজন প্রার্থী থাকলেও defaultপদ্ধতির প্রতি সাধারণ পছন্দ নেই pre
এখনও অবধি, দুটি প্রয়োগযোগ্য পদ্ধতি এবং একটি defaultপদ্ধতি এবং উত্তরাধিকারের সম্পর্ক জড়িত থাকাকালীন সমস্যাটি উপস্থিত হতে পারে বলে মনে হয় তবে এটি আরও খননের সঠিক জায়গা নয়।
তবে এটি বোধগম্য যে আপনার উদাহরণটির রচনাগুলি সংকলকটিতে বিভিন্ন বাস্তবায়ন কোড দ্বারা পরিচালিত হতে পারে, একটি বাগ প্রদর্শন করে অন্যটি না করে।
a -> aList.add(a)একটি স্পষ্টভাবে টাইপ করা ল্যাম্বদা এক্সপ্রেশন, যা ওভারলোড রেজোলিউশনের জন্য ব্যবহার করা যায় না can't বিপরীতে, (A a) -> aList.add(a)একটি স্পষ্টত টাইপিত ল্যাম্বডা এক্সপ্রেশন যা ওভারলোডেড পদ্ধতিগুলি থেকে কোনও ম্যাচিং পদ্ধতি নির্বাচন করতে ব্যবহার করা যেতে পারে, তবে এটি এখানে সহায়তা করে না (এখানে সহায়তা করা উচিত নয়), কারণ সমস্ত পদ্ধতিতে একই কার্যকরী স্বাক্ষরের সাথে প্যারামিটারের ধরন রয়েছে ।
একটি পাল্টা উদাহরণ হিসাবে, সঙ্গে
static void forEach(Consumer<String> c) {}
static void forEach(Predicate<String> c) {}
{
forEach(s -> s.isEmpty());
forEach((String s) -> s.isEmpty());
}
কার্যকরী স্বাক্ষরগুলি পৃথক, এবং একটি স্পষ্টত ধরণের ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে সঠিক পদ্ধতি নির্বাচন করতে সহায়তা করতে পারে যেখানে স্পষ্টভাবে টাইপ করা ল্যাম্বডা এক্সপ্রেশনটি সাহায্য করে না, তাই forEach(s -> s.isEmpty()) সংকলক ত্রুটি তৈরি করে। এবং সমস্ত জাভা সংকলকরা সে সম্পর্কে একমত।
দ্রষ্টব্য যে aList::addএকটি দ্ব্যর্থক পদ্ধতি পদ্ধতির রেফারেন্স, কারণ addপদ্ধতিটি খুব বেশি লোড হয়েছে, সুতরাং এটি কোনও পদ্ধতি নির্বাচন করতেও সহায়তা করতে পারে না, তবে পদ্ধতি রেফারেন্সগুলি যাইহোক বিভিন্ন কোড দ্বারা প্রক্রিয়াজাত হতে পারে। দ্ব্যর্থহীন হয়ে ওঠার জন্য একটি দ্ব্যর্থহীন aList::containsপরিবর্তন বা পরিবর্তিত Listকরা Collection, addআমার Eclipse ইনস্টলেশন (আমি ব্যবহৃত 2019-06) এর ফলাফলটি পরিবর্তন করিনি ।