2013-01-10 9 views
6

मुझे थोड़ा सा सामान्य कोड मिला और यह मुझे वास्तव में काम करता है कि यह वास्तव में कैसे काम करता है। मुझे समझ में नहीं आता कि यह सामान्य प्रकार कहां प्राप्त होता है जिसका उपयोग टी के लिए किया जाता है यह एक अतिरूप उदाहरण है लेकिन मुझे अभी भी यह समझ में नहीं आता कि यह वैध जावा कोड कैसे है।यह जावा फ़ंक्शन कहां से अपने सामान्य प्रकार का अनुमान लगाता है?

public static void main(String[] args) { 
    System.out.print(get()); 
} 

public static <T> T get() 
{ 
    return (T) getObj(); 
} 

public static Object getObj() 
{ 
    return Boolean.FALSE; 
} 
+0

देखें http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 – SLaks

+0

आपको ऑब्जेक्ट से अनचेक कास्ट के बारे में एक कंपाइलर चेतावनी देखना चाहिए 'से' टी'। – GriffeyDog

उत्तर

3

प्रकार अनुमान callsite के आधार पर होता है।

हालांकि, टाइप करें केवल वापसी प्रकारों पर लागू होता है यदि वापसी मान किसी चर को असाइन किया गया हो। यह spec

में लिखा है विधि परिणाम एक संदर्भ में होता है जहां यह काम रूपांतरण के अधीन किया जाएगा, तो [...]

अन्यथा, किसी भी अनसुलझे प्रकार पैरामीटर हमेशा बन Object
आपके उदाहरण में, यह काम करेगा, क्योंकि print(Object) अधिभार है।

दूसरी ओर, इस कोड को देखो: क्योंकि संकलक print() को देख पहले Object लौटने के रूप में get() infers

print(get()); 

public void print(Boolean x) { } 

public <T> T get() { 
    return (T) Boolean.FALSE; 
} 

यह एक संकलन त्रुटि दे देंगे।

+0

वापसी विवरण भी असाइनमेंट रूपांतरण के अधीन है। जावा 8 में, टाइप अनुमान अधिक प्रासंगिक जानकारी नियोजित करेगा। – irreputable

1

कोड आप टी लिखा में बाध्य नहीं कुछ भी करने के लिए है। जब भी आप get विधि का आह्वान करते हैं तो जावा एक प्रकार को टी असाइन करेगा और यह उस प्रकार को देखेगा जिसे आप वापस पाने की उम्मीद कर रहे हैं ... लेकिन ऐसा लगता है कि अगर आप स्पष्ट रूप से घोषित करते हैं कि आप किस प्रकार की प्रतीक्षा कर रहे हैं। निम्न उदाहरण को देखो:

public static void jump(String a) { 
} 

public static <T> T get() { 
    return (T) null; 
} 

public static void main(String[] args) { 
    //This works quite well, generic parameter T is inferred to be String 
    String blah = get(); 
    jump(blah); 
} 

दूसरी ओर

public static void jump(String a) { 
} 

public static <T> T get() { 
    return (T) null; 
} 

public static void main(String[] args) { 
    //This doesn't work, Java does not bind T to anything hence Object is used... and no jump for object is found 
    jump(get()); 
} 

पर कम से कम इस यह कैसे जावा पर काम करता है 6.

+0

नियम क्या है जिसका अर्थ है कि यह 'प्रिंट (स्ट्रिंग)' की बजाय 'प्रिंट (ऑब्जेक्ट) 'चुनता है? –

+1

ठीक है तो अगर मैंने इसे प्रिंट करने का प्रयास नहीं किया और इसे सीधे कहा। सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) { प्राप्त करें(); } तब से यह कहां से प्राप्त किया जाता है? – Deadron

+0

मैं गलत था, मुझे लगता है कि टी inferrend और कुछ भी बाध्य नहीं है। फिर ऑब्जेक्ट का उपयोग किया जाता है क्योंकि यह सबसे अमूर्त चीज है जिसे जावा संभाल सकता है। मेरे उत्तर को संपादित करना – Claudio