2010-08-10 4 views
11

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) एक अनंत प्रकार होना चाहिए। जैवैक यहां गलत लगता है। शायद यह अनंत प्रकारों को लागू नहीं करता है?

+1

अपने उद्धरण के अंतिम भाग को ध्यान में रखें: "... जावा कंपाइलर्स को ऐसी स्थितियों को पहचानना चाहिए और उन्हें उचित रूप से प्रस्तुत करना चाहिए ..."। किसी भी कंपाइलर जो चश्मा के अनुरूप है, वह भी झपकी नहीं देगा अगर आपने इसे "अनंत प्रकार" दिया है। मिश्रण में टाइप एरर जोड़ें, और आपके उदाहरण में सब कुछ सिर्फ तुलनात्मक या ऑब्जेक्ट में बदल जाता है। तो जब तक कि आप एक जावा कंपाइलर नहीं बना रहे हैं, तो आप शायद कभी भी ध्यान नहीं देंगे। – cHao

+0

@cHao: ऐसा लगता है जैसे सूर्य का जावैक spec के अनुरूप नहीं है। मैं इसके साथ किसी भी अनंत प्रकार का उत्पादन करने में सक्षम नहीं था, इसलिए मैं इस सवाल से पूछ रहा हूं। ऐसा लगता है कि उन्होंने इस भाषा सुविधा को अनुपूरक छोड़ दिया है। – Daniel

उत्तर

10

निम्न कोड एक अनंत लूप को javac भेजता क्या देख रहे हैं। मुमकिन है, यह एक अनंत प्रकार का निर्माण करने की कोशिश करता है, लेकिन इसे एक सीमित चक्रीय डेटा संरचना के रूप में प्रस्तुत करने का प्रबंधन नहीं करता है।

interface I<T> {} 
interface A<T> extends I<A<A<T>>>{} 
abstract class X { 
    abstract <T> T foo(T x, T y); 

    void bar(A<Integer> x, A<String> y){ 
     foo(x, y); 
    } 
} 
+0

बहुत अच्छा उदाहरण! –

+1

मुझे लगता है कि यह उदाहरण "विशाल विरासत" का मामला है। विस्तृत विरासत में एक अनंत लूप शामिल होता है जो कि अनंत प्रकार की श्रृंखला (पिछले की तुलना में प्रत्येक बड़ा) उत्पन्न करता है। लेकिन शामिल हर प्रकार सीमित है, इसलिए यह वास्तव में सवाल का जवाब नहीं है। (मुझे संदेह है कि सवाल असंभव है, क्योंकि जावैक असीमित प्रकारों को वास्तव में लागू नहीं करता है) – Daniel

0

अनंत प्रकार के संभावना हो सकता है (उदाहरण के लिए, आदि एक नक्शे के अंदर एक नक्शा, अंदर मानचित्र की एक वस्तु .....

Map<? extends Serializable, Map<? extends Serializable, Map<? extends Serializable, Map<? extends Serializable, Map<? extends Serializable, Map>>>>> objectMap; 

(यह पठनीयता के लिए गहराई से 5 से किया जाता है .. लेकिन आप एक नक्शे के असीम गहरी अंदर नक्शे जोड़ सकते हैं।

मैं नहीं जानता कि यदि आप के लिए ....

+1

तो आप इस प्रकार का उत्पादन कैसे करते हैं? इसे नामित नहीं किया जा सकता है (एक अनंत स्रोत फ़ाइल की आवश्यकता होगी), इसलिए यह केवल प्रकार अनुमान के परिणामस्वरूप हो सकता है।मैं एक उदाहरण विधि कॉल की तलाश में हूं जहां जावा इस तरह के एक अनंत प्रकार का अनुमान लगाता है। – Daniel

+0

आपको इसे प्रतिबिंबित करना होगा .... –

+0

प्रतिबिंब टाइप पैरामीटर प्राप्त करने में सक्षम नहीं होगा - वे संकलन के समय से चले गए हैं। "अनंत प्रकार" केवल संकलन के दौरान प्रासंगिक होते हैं, पहले नहीं (टाइप अनुमान उन्हें उत्पन्न करता है, और उन्हें अधिक या कम पारदर्शी रूप से संभालता है), और बाद में नहीं (टाइप एरर टाइप पैरामीटर से छुटकारा पाता है, एक अनंत प्रकार को सामान्य प्रकार में बदल देता है वस्तु की तरह)। – cHao

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