2014-10-03 5 views
8

जावा चल रहा है का विस्तार 1.8 JavaSE-1.8 (jdk1.8.0_20)जेनेरिक्स समारोह कॉल जावा में संकलन नहीं 8 एकाधिक इंटरफेस

इस वर्ग:

:

public class SimpleQuestion { 

    public static void main(String[] args) { 
     DoNothing(); 
     DoNothing2(); 
     DoNothing3(); 
     DoNothing4(); 
    }  

    public interface Interface1 { 
     public void go(); 
    } 

    public interface Interface2<X> { 
     public X go2(); 
    } 

    private static <X, T extends Interface2<X> & Interface1> void DoNothing() { 
     return; 
    } 

    private static <X, T extends Interface2 & Interface1> void DoNothing2() { 
     return; 
    } 

    private static <X, T extends Interface2<X>> void DoNothing3() { 
     return; 
    } 

    private static <T extends Interface2<T> & Interface1> void DoNothing4() { 
     return; 
    }  

} 

संकलन त्रुटि देता है सरल क्वेशेशन प्रकार में विधि DoNothing() तर्क के लिए लागू नहीं है()

Wh y कि एक और नहीं कुछ नहीं 2,3, और 4?

+11

यह ग्रहण में विफल रहता है। ओरेकल कंपाइलर मेरे लिए काम करता है। मैं बग रोता हूँ! –

+0

हालांकि, यदि आप स्पष्ट रूप से प्रकार तर्क प्रदान करते हैं तो यह काम करता है। –

+0

जावा 7 में मेरे लिए ठीक संकलित करता है; संभावित रूप से संकलक/आईडीई में एक बग आप – Krease

उत्तर

4

त्रुटि संदेश section 18.5.1 of the spec में परिभाषित एल्गोरिदम की विफलता का जिक्र करता प्रतीत होता है।

DoNothing के लिए, एल्गोरिथ्म आय के रूप में इस प्रकार है (ऊपर के लिंक से शब्दावली का उपयोग):

  • प्रकार पैरामीटर हैं

    P1 = X

    P2 = T extends Interface2<X> & Interface1

    और मैं संबंधित अनुमान चर के लिए ए 1 और ए 2 का उपयोग करेंगे।

  • प्रारंभिक बाध्य सेट

    B0 = {a1 <: Object, a2 <: Interface2<a1>, a2 <: Interface1}

  • है कोई तर्क है, तो बिना किसी अतिरिक्त सीमा इस बिंदु (बी 2 = B0) को जोड़ा जाता हैं।

  • ए 1 पर ए 2 की निर्भरता है, इसलिए हम पहले ए 1 को हल करने का प्रयास करते हैं। यह ऑब्जेक्ट का उचित ऊपरी बाउंड है, इसलिए हम इसे तुरंत चालू करते हैं। शामिल a1 = Object बाध्य

    a2 <: Interface2<Object>

  • अगला हम a2 हल जोड़नी पड़ती है। यह अब दो उचित ऊपरी सीमा है, इसलिए हम उनके GLB को a2 का दृष्टांत:

    a2 = Interface2<Object> & Interface1

  • हर चर अब एक इन्स्टेन्शियशन है तो संकल्प सफल रहा है।

इसलिए, त्रुटि संदेश के विपरीत, DoNothing का आमंत्रण लागू होना चाहिए। यह आपके जावा कंपाइलर में एक बग प्रतीत होता है।

संबंधित मुद्दे