JLS प्रकार निष्कर्ष एल्गोरिथ्म (§15.12.2) में उल्लेख है:जावा टाइप अनुमान कब एक अनंत प्रकार का उत्पादन करता है?
यह है कि इस प्रक्रिया से ऊपर एक अनंत प्रकार पैदावार संभव है। यह अनुमत है, और जावा कंपाइलर्स को ऐसी परिस्थितियों को पहचानना चाहिए और चक्रीय डेटा संरचनाओं का उपयोग करके उचित रूप से उनका प्रतिनिधित्व करना चाहिए।
हालांकि, मैं एक वास्तविक उदाहरण है जहाँ javac एक अनंत प्रकार का उत्पादन खोजने में असमर्थ हूँ। मुझे लगता है कि निम्नलिखित मामले में एक निर्माण करने के लिए चाहिए:
<T> T pick(T a, T b) { ... }
pick("string", 3);
दोनों स्ट्रिंग और पूर्णांक, तुलनीय < themselve> हैं, इसलिए उनके आम महाप्रकार Comparable<? extends Comparable<? extends Comparable<? ...>>>
(अनंत) होना चाहिए।
मैं कर सकते हैं:
Comparable<? extends Comparable<?>> x = pick("string", 3);
लेकिन फिर मैं करने की कोशिश की:
Comparable<? extends Comparable<? extends Comparable<?>>> x = pick("string", 3);
और इस संकलन नहीं है। ऐसा लगता है कि रिकर्सन 2 चरणों के बाद निरस्त कर दिया गया है।
क्या आप जावा को असीमित प्रकार का उत्पादन करने के लिए किसी भी मामले के बारे में जानते हैं?
-
संपादित करें: ऐसा लगता है कि इसके बाद के संस्करण एक संकलक बग है। विनिर्देश पढ़ना, देखते हैं कैसे lub(String, Integer)
की गणना बाहर काम करता है:
ST(String) = { String, Comparable<String>, Serializable, CharSequence, Object }
ST(Integer) = { Integer, Comparable<Integer>, Serializable, Number, Object }
EC = { Comparable, Serializable, Object }
MEC = { Comparable, Serializable }
Inv(Comparable) = { Comparable<String>, Comparable<Integer> }
lcta(String, Integer) = ? extends lub(String, Integer)
lci(Inv(Comparable)) = Comparable<? extends lub(String, Integer)>
lub(String, Integer) = Serializable & Comparable<? extends lub(String, Integer)>
तो lub(String, Integer)
एक अनंत प्रकार होना चाहिए। जैवैक यहां गलत लगता है। शायद यह अनंत प्रकारों को लागू नहीं करता है?
अपने उद्धरण के अंतिम भाग को ध्यान में रखें: "... जावा कंपाइलर्स को ऐसी स्थितियों को पहचानना चाहिए और उन्हें उचित रूप से प्रस्तुत करना चाहिए ..."। किसी भी कंपाइलर जो चश्मा के अनुरूप है, वह भी झपकी नहीं देगा अगर आपने इसे "अनंत प्रकार" दिया है। मिश्रण में टाइप एरर जोड़ें, और आपके उदाहरण में सब कुछ सिर्फ तुलनात्मक या ऑब्जेक्ट में बदल जाता है। तो जब तक कि आप एक जावा कंपाइलर नहीं बना रहे हैं, तो आप शायद कभी भी ध्यान नहीं देंगे। – cHao
@cHao: ऐसा लगता है जैसे सूर्य का जावैक spec के अनुरूप नहीं है। मैं इसके साथ किसी भी अनंत प्रकार का उत्पादन करने में सक्षम नहीं था, इसलिए मैं इस सवाल से पूछ रहा हूं। ऐसा लगता है कि उन्होंने इस भाषा सुविधा को अनुपूरक छोड़ दिया है। – Daniel