2008-11-24 8 views
74

निम्नलिखित कोडबग ("टी के प्रकार के मापदंडों का निर्धारण नहीं किया जा सकता है")

public class GenericsTest2 { 

    public static void main(String[] args) throws Exception { 
     Integer i = readObject(args[0]); 
     System.out.println(i); 
    } 

    public static <T> T readObject(String file) throws Exception { 
     return readObject(new ObjectInputStream(new FileInputStream(file))); 
     // closing the stream in finally removed to get a small example 
    } 

    @SuppressWarnings("unchecked") 
    public static <T> T readObject(ObjectInputStream stream) throws Exception { 
     return (T)stream.readObject(); 
    } 
} 

ग्रहण में संकलित है, लेकिन javac (टी के प्रकार के पैरामीटर निर्धारित नहीं किया जा सकता है के साथ नहीं, कोई अनोखी ऊपरी सीमा टी, java.lang.Object) के साथ प्रकार परिवर्तनीय टी के लिए अधिकतम उदाहरण मौजूद है।

जब मैं

@SuppressWarnings("unchecked") 
    public static <T> T readObject(String file) throws Exception { 
     return (T)readObject(new ObjectInputStream(new FileInputStream(file))); 
    } 

को readObject (स्ट्रिंग फ़ाइल) को बदलने के लिए यह ग्रहण में और javac के साथ संकलित करता है। कौन सही है, ग्रहण कंपाइलर या जावैक?

उत्तर

66

मैं कहना चाहता हूँ यह सूर्य संकलक here और here सूचना में बग है, क्योंकि अगर आप नीचे एक करने के लिए अपनी लाइन बदल यह दोनों के साथ काम करता है, जो कि बग रिपोर्ट में वर्णित है।

return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file))); 
13

इस मामले में, मैं कहूंगा कि आपका कोड गलत है (और सूर्य संकलक सही है)। वास्तव में T टाइप करने के लिए readObject पर आपके इनपुट तर्कों में कुछ भी नहीं है। उस स्थिति में, आप ऑब्जेक्ट को वापस करने के लिए बेहतर हैं, और क्लाइंट को परिणाम प्रकार मैन्युअल रूप से डालने दें।

यह काम करना चाहिए (हालांकि मैं यह परीक्षण नहीं किया):

public static <T> T readObject(String file) throws Exception { 
    return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file))); 
} 
+1

वापसी जेनिक्सटेस्ट 2। readObject (नया ऑब्जेक्ट इनपुटपुट (नई फ़ाइल इनपुटस्ट्रीम (फ़ाइल))); काम करेगा। धन्यवाद! –

+1

मैं असहमत हूं, यह नीचे संबंधित बग की तरह दिखता है। संकलक बिना प्रकार निष्कर्ष एक स्पष्ट कलाकारों पर भरोसा करना चाहिए - निम्नलिखित ठीक @SuppressWarnings संकलित ("अनियंत्रित") सार्वजनिक स्थिर टी createT (स्ट्रिंग className) फेंकता अपवाद { वापसी (टी) Class.forName (className) .newInstance(); } –

3

ओरेकल JDK6 U22 सही किया जाना चाहिए, लेकिन मैं JDK6 U24 के साथ इस समस्या है भी

यह ग्रहण bug 98379 की एक बग है।

यह ठीक नहीं किया गया था, लेकिन समस्या आप पारदर्शी रूप से काम करने के लिए जब कहा जाता है अपने विधि readObject संशोधित कर सकते हैं, तो ग्रहण कीड़े में उदाहरण (देखें लिंक)

0

की तरह वैकल्पिक हल के माध्यम से हल हो गई है, तो आप निम्न का उपयोग भी कर सकते हैं:

public static <T> T readObject(String file, Class<T> type) throws Exception { 
    return type.cast(readObject(new ObjectInputStream(new FileInputStream(file)))); 
} 

इस तरह, कॉलर को परिणाम के प्रकार को निर्दिष्ट करने के लिए मजबूर होना पड़ता है और संकलक जानता है कि परिणाम कैसे डाला जाए।

1

मुझे जावा संस्करण "1.6.0_22" में यह समस्या मिली। यह गायब हो गया जब मैंने जावा संस्करण "1.6.0_32" में अपग्रेड किया क्योंकि यह अपडेट 25 में तय किया गया था।

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

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