8

में विधि प्रकार अनुमान I वर्तमान में जावा कंपाइलर लिख रहा है और अनुभाग 15.12.2.7 लागू किया है। जेएलएस 7 (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7), spec के सबसे कष्टप्रद वर्गों में से एक। मुझे अभी भी एक समस्या है क्योंकि spec किसी भी तरह से underspecified या संदिग्ध लगता है। मेरी समस्या यह है कि:जावा विशिष्टता

lcta (यू) =? यदि यू की ऊपरी सीमा वस्तु है, अन्यथा? लब (यू, ऑब्जेक्ट)

यू एक मनमाना प्रकार अभिव्यक्ति है। एक प्रकार अभिव्यक्ति की ऊपरी सीमा क्या है? इसके अलावा, लैक्टा हमेशा एक वाइल्डकार्ड क्यों है?

कल्पना को परिभाषित करता है

CandidateInvocation (G) = LCI (चालान (G))

अब, उदाहरण के लिए, इस मामले पर विचार करें कि Inv (G) = {List < स्ट्रिंग >}, यानी, केवल संभावित उम्मीदवार आमंत्रण एक ही पैरामीटरयुक्त प्रकार है। अब, कारण शासन के लिए

LCI (जी < X1, ..., xn >) = जी < lcta (X1), ..., lcta (Xn) >,

का परिणाम CandidateInvocation (G) = LCI ({सूची < स्ट्रिंग >}) के रूप में परिभाषित किया जाएगा:

सूची < lcta (स्ट्रिंग) >

मेरी राय में

, lcta सरल चाहिए लाइ रिटर्न स्ट्रिंग यहां, क्योंकि यदि सूची < स्ट्रिंग > एकमात्र संभावित आमंत्रण है, तो तर्क < स्ट्रिंगको तर्क के रूप में वर्णित करना एक अच्छा विचार है। हालांकि, लैक्टा (यू) की परिभाषा यह बताती है कि परिणाम या तो है? या? लब (...) बढ़ाता है, इसलिए परिणाम हमेशा एक वाइल्डकार्ड होता है। यह अजीब लगता है। मैं यहां गलत व्याख्या क्या कर रहा हूं?

उत्तर

1

मैं संकलक-देव मेलिंग सूची में पूछा और जवाब मिला है:

हाँ, विनिर्देश यहाँ गलत है। लक्टा (यू) के लिए नियम बस कुल बकवास है :)। इसके अलावा, उन्होंने दावा किया कि यह भी एक बेहतर तर्क के लिए lcta (यू) को कॉल करने के लिए बेहतर होगा और केवल यू का उपयोग करें (क्योंकि एक तर्क के कम से कम सामान्य प्रकार तर्क यू हमेशा यू होना चाहिए)।

6

यह कल्पना की एक बग की तरह दिखता है। JS123 में lcta(U) का खंड मौजूद नहीं था। स्पष्ट रूप से lci(e1..en) की जेएलएस 3 की परिभाषा अपूर्ण है जब n=1, और नया स्पेक इसे ठीक करने का प्रयास करता है। लेकिन जैसा कि आपने तर्क दिया था, ठीक है, ठीक है।

Javac7 lci({ List<String> })List<String> के रूप में गणना की गई खंडों को अनदेखा करता है।

यह समस्या spec maintainers को उठाया जाना चाहिए; सुनिश्चित नहीं है कि उनसे संपर्क कैसे करें। आप openjdk कंपाइलर-देव मेलिंग सूची का प्रयास कर सकते हैं; इस पर कुछ जानकार लोग हैं।

+0

मैंने अब lcta (यू) = यू लागू किया है जो ठीक काम करता प्रतीत होता है। अगर मैं किसी भी मामले को ढूंढता हूं तो मैं रिपोर्ट करूंगा कि यह कार्यान्वयन आश्चर्यजनक परिणाम उत्पन्न करता है।वैसे: लब (यू, ऑब्जेक्ट) हमेशा यू नहीं है, क्योंकि ऑब्जेक्ट हमेशा यू का एक सुपर क्लास होता है और इस प्रकार {यू, ऑब्जेक्ट} के कम से कम मिटाए गए उम्मीदवार एमईसी को हमेशा यू या उसके उप-वर्गों में से एक मिलना चाहिए? इस प्रकार, नियम वास्तव में पूरा बकवास है। एकमात्र चीज जो इसे बदलने के लिए अच्छा हो सकती है? ऑब्जेक्ट को बढ़ाता है? हालांकि, चूंकि यू एक प्रकार की अभिव्यक्ति है, इसमें वाइल्डकार्ड नहीं हो सकते हैं इसलिए यह मामला कभी नहीं उभर सकता ... वास्तव में अजीब। – gexicide

+0

और मेलिंग सूची के साथ अच्छा विचार, मुझे लगता है कि मैं इसे कोशिश करूँगा – gexicide

+0

मुझे लगता है कि लब (यू, ऑब्जेक्ट) = ऑब्जेक्ट – irreputable

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