2013-03-15 11 views
25

क्यों कंपाइलर फ़ंक्शन रिटर्न प्रकार के मामले में String टाइप पैरामीटर का सही ढंग से अनुमान लगाने में सक्षम है।जावा 7 जेनेरिक प्रकार अनुमान: वापसी मूल्य बनाम विधि तर्क

public class Generics { 
    public static void main(String[] args) { 
     method(new ArrayList<>()); 
    }  

    private static void method(List<String> list) { 

    } 
} 

इस मामले में त्रुटि है:

public class Generics { 
    private static List<String> function() { 
     return new ArrayList<>(); 
    } 
} 

लेकिन जब प्रकार अनुमान लगाने के लिए यह असफल एक विधि पैरामीटर है

The method method(List<String>) in the type Generics is not applicable 
for the arguments (ArrayList<Object>) 
+7

क्योंकि जहां भी संभव हो, वे सामान्य प्रकार के अनुमान को कार्यान्वित करने से परेशान नहीं थे। मैंने इस विशिष्ट मामले का परीक्षण नहीं किया है, लेकिन जावा 8 लैम्बडास की सहायता के लिए प्रकार अनुमान के संबंध में बहुत सारे सुधार लाता है। –

+1

ऐसा इसलिए है क्योंकि परिमित समय में हल करने के लिए सही प्रकार की अनुमान बहुत कठिन समस्या है (यह जटिलता के समान क्रम पर रोकथाम की समस्या के रूप में है)। इस प्रकार, जावा डेवलपर्स को कहीं रेखा खींचनी पड़ी। जैसा कि अन्य ने ध्यान दिया है, वे लगातार लाइन को आगे बढ़ा रहे हैं, लेकिन कुछ सीमाएं मौजूद हैं। –

+1

@ कॉन्स्टेंटिन नारीशकिन: जावा 8 पर किए गए काम से पता चलता है कि उन्होंने लाइन को जल्दी ही खींचा। अधिक उपयोगी नियम * * संभव हैं * * जावा 8 में एकीकृत किए जा रहे हैं। यह कहना आसान है कि उन्हें इसे पहली बार धक्का देना चाहिए था, लेकिन यह अनुमान करना मुश्किल है कि अतिरिक्त कार्य के वास्तविक लाभ क्या हैं। सभी शुरुआती कार्यान्वयन में बहुत उपयोगी था। लेकिन यह पहले सुधार किया जा सकता था। –

उत्तर

16

यह स्थानों में से एक है, जहां प्रकार निष्कर्ष है अभी तक उम्मीद के रूप में काम नहीं करता है।

दुर्भाग्यवश यह व्यवहार पूरी तरह से मान्य और अनुरूप है।

यह उचित है कि संकलक प्रकार अनुमान लगाने के लिए सक्षम होना चाहिए लगता है जब परिणाम:

अच्छी खबर यह है कि Java 8, improved type inference (JEP 101) शामिल होंगे तो इन परिस्थितियों संकलन चाहिए आप इसकी अपेक्षा बस के रूप में है इस तरह के एक सामान्य विधि आविष्कार की एक और विधि [...] को पारित किया जाता है।

दुर्भाग्यवश, जेडीके 5/6/7 में इसकी अनुमति नहीं है - प्रोग्रामर के लिए उपलब्ध एकमात्र विकल्प एक स्पष्ट प्रकार-तर्क का उपयोग करना है।

अलावा प्रत्यक्ष सुधार (जिन्हें आप यहाँ उल्लेख की तरह अर्थात स्थितियों) से, यह परिवर्तन भी (प्रकार की जानकारी का एक बहुत कुछ लिखे बिना अर्थात) और अधिक कुशलता से Lambdas (JEP 126) का उपयोग करने में सक्षम होने के लिए आवश्यक है।

+0

यूप, उनके पास मूल रूप से सटीक वही उदाहरण लिखा गया है। – aglassman

+2

ऐसा लगता है कि जावा 8 जावा 5 के बाद से अधिक जावा रिलीज होगा। मैं इसके साथ विकसित करने के लिए काफी अधीर हूं। इन्हें अभी भी जावा 1.4 का उपयोग करना है, मेरे विचारों में हैं। – gontard

6

JLS में inferring unresolved type arguments पर अनुभाग जटिल है, लेकिन मैं समझता हूँ कि पहले मामले की हीरे की एक जगह है जहाँ यह एक काम रूपांतरण के अधीन है, जबकि दूसरे मामले में यह एक विधि में होता है में होता है आमंत्रण रूपांतरण, जो विभिन्न नियमों का पालन करता है।

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