2016-11-23 11 views
6

निम्न संकलन क्यों करें? मैं एक चेतावनी मुझे बता कियह संकलन क्यों करता है? टाइप करें

getTest मिल() तो getTestIntegers एक कच्चे प्रकार() मिटाए जाने

रिटर्न लेकिन मुझे समझ नहीं आता क्यों, getTestIntegers() साधारण नहीं है। मैं List<String> tester = Test.getTest().getTestIntegers() अपेक्षा की होगी एक संकलन त्रुटि

public class Scratchpad { 

    public static void main(String[] args) { 
     new Scratchpad().run(); 
    } 

    private void run() { 
     List<String> tester = Test.getTest().getTestIntegers(); 
    } 

    private static class Test<T> { 

     public static Test getTest() { 
      return new Test(); 
     } 

     public List<Integer> getTestIntegers() { 
      return Collections.singletonList(1); 
     } 
    } 
} 
+2

चेतावनी का कहना है के रूप में, विधि 'getTest' कच्चे प्रकार' Test' देता है। ऐसा नहीं करना चाहिए; आपको उस विधि में एक प्रकार पैरामीटर जोड़ना चाहिए। जब आप कच्चे प्रकार का उपयोग करते हैं, तो कंपाइलर पिछड़ा संगतता मोड में जाता है और चीजें आपके जैसी अपेक्षा नहीं करती हैं। देखें: [कच्चा प्रकार क्या है और हम इसका उपयोग क्यों नहीं करना चाहिए?] (Http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use -it) – Jesper

+0

लिंक के लिए धन्यवाद, खंड "एक कच्चा प्रकार उस प्रकार का क्षरण है" इसके साथ सौदा करता है और यह स्पष्ट रूप से जेएलएस में है। लेकिन मुझे क्या नहीं मिला है क्यों? 'GetTestIntegers()' को मिटाने की आवश्यकता के लिए तर्क क्या है? –

उत्तर

2

जैसा कि पहले ही बताया गया निर्माण करने के लिए, getTest एक कच्चे प्रकार देता है। पद्धति की एक सही कार्यान्वयन इस प्रकार दिखाई देगा:

public static <T> Test<T> getTest() { 
    return new Test<>(); 
} 

ध्यान दें कि आप स्थिर तरीकों के लिए एक सामान्य पैरामीटर निर्दिष्ट करने की आवश्यकता -, यह कुछ भी हो सकता है क्योंकि यह नहीं ही T है वर्ग हस्ताक्षर में के रूप में (लेकिन एक ही नाम का उपयोग करना सामान्य है, अगर इसका उपयोग उसी स्थान पर किया जाता है)।

फिर यह निर्भर करता है कि संकलक सही प्रकार का अनुमान लगा सकता है, कभी-कभी इसे आपकी "सहायता" की आवश्यकता हो सकती है, उदा।

List<String> tester = Test.<String>getTest().getTestIntegers(); 

(मैं बाहर की कोशिश नहीं करता है, तो यह वहाँ आवश्यक है, लेकिन यह है कि यह कैसे दिखता है)

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