জাভা -8 এ পদ্ধতি রেফারেন্স এবং জেনেরিক্স


11

জেনেরিক ধরণের সাথে একত্রে পদ্ধতি রেফারেন্স সহ আমি সমস্যার মুখোমুখি ।

আমাদের কোড রয়েছে যেখানে আমাদের একটি ওভারলোডেড পদ্ধতিটি কল করতে হবে, তবে এটি ত্রুটির সাথে ব্যর্থ হচ্ছে:

এম 1 () মানটি সমাধান করতে পারে না

সমস্যাটি কোথায় রয়েছে তা পরিষ্কার করার জন্য আমি আমার সমস্যাটি সরল করে তুলেছি।

নিম্নলিখিত কোড ব্যর্থ:

public class Test {
    void test() {
        // Getting error here
        setValue(C1::m1, Integer.ONE);
    }

    <E extends I1, T> void setValue(BiConsumer<E, T> cons, T value) {
    }
}

interface I1 {
}

class C1 implements I1 {
    void m1(Integer value) {
    }

    void m1(int value) {
    }
}

কেউ দয়া করে কেন এমন আচরণ করছে?

দয়া করে নোট করুন এটি জেনেরিক ধরণের সাথে জাভা 8 পদ্ধতির প্রশ্নের সাথে সম্পর্কিত নয়


না, যদি আমি এটির যে কোনও পদ্ধতিতে কাজ করে চলেছি তা যদি ঠিক থাকে তবে
জোকার

এই প্রশ্নটি আবার খোলার জন্য ধন্যবাদ ... :)
জোকার

উত্তর:


7

দেখে মনে হচ্ছে যে প্রকারের অনুমানের নিয়মগুলি সঠিক স্মার্টফোনটি বাছাই m1করা এবং setValueকলটিতে সঠিক inferred ধরণের পরামিতি উত্পন্ন করার জন্য ( Bএবং BigDecimalযথাক্রমে) যথাযথ "স্মার্ট" নয় ।

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

কোনও প্রকার সাক্ষী যুক্ত করে (আপনি কোন ধরণের প্যারামিটারগুলির setValueসাথে কল করতে চান তা নির্দিষ্ট করে ) সংযোগকারী সঠিক m1পদ্ধতিটি বেছে নেবে এই সমস্যাটি নিয়ে আপনি কাজ করতে পারেন :

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);

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