जावा -8 में विधि संदर्भ और जेनरिक


11

मैं जेनेरिक प्रकारों के साथ संयुक्त विधि संदर्भ के साथ समस्या का सामना कर रहा हूं ।

हमारे पास कोड है जहां हमें एक अधिभार विधि को कॉल करने की आवश्यकता है, लेकिन यह त्रुटि के साथ विफल हो रहा है:

मूल्य m1 () नहीं हल कर सकते

मैंने अपनी समस्या को यह स्पष्ट करने के लिए सरल किया है कि समस्या कहाँ है।

निम्न कोड विफल रहता है:

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कॉल ( Bऔर BigDecimalक्रमशः) के लिए सही अनुमान प्रकार के मापदंडों को उत्पन्न करने के बीच संघर्ष को हल करने के लिए प्रकार के अनुमान नियम "स्मार्ट" नहीं हैं ।

मैं यह स्पष्ट नहीं कर सकता कि यह क्यों विफल हो जाता है, लेकिन टाइप इंट्रेंस पारंपरिक रूप से आर्कियन, अच्छी तरह से तर्क और अन-सहज ज्ञान युक्त नियमों वाला क्षेत्र रहा है, इसलिए मैं बहुत आश्चर्यचकित नहीं हूं।

आप इस मुद्दे के चारों ओर एक प्रकार का गवाह जोड़कर काम कर सकते हैं (यह निर्दिष्ट करते हुए कि आप किस पैरामीटर को कॉल करना चाहते हैं setValue) किस बिंदु पर कंपाइलर सही m1विधि चुनेंगे:

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

लगता है कि मैं docs.oracle.com/javase/specs/jls/se8/html/…
Joker
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.