मैं इस प्रश्न के लिए एक उचित शीर्षक खोजने के लिए संघर्ष कर रहा था क्योंकि मैंने जो घटना देखी वह बहुत अजीब है। इसलिए मैं अपनी समस्या को शाब्दिक रूप से समझाता हूं और इसके बजाय आपको कुछ (उम्मीदपूर्वक) आत्म-वर्णन कोड दिखाता हूं। निम्नलिखित पैरामिट्रीकृत वर्ग पर विचार करें:एक्लिप्स कंपाइलर निश्चित प्रकार पैरामीटर क्यों खो देता है?
public class GenericOptional<T> {
public GenericOptional(T someValue) {}
public T getValue() { return null; }
public Optional<String> getOptionalString() { return Optional.empty(); }
}
क्या मैं जोर देना चाहते है कि वापसी प्रकार विधि getOptionalString()
प्रकार पैरामीटरT
पर निर्भर नहीं करता की Optional<String>
।
अब जावा 8u45 का उपयोग कर निम्नलिखित कोड है, जो अंदर ग्रहण लूना 4.4.2 संकलित हो जाता है पर एक नजर है:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional go = (GenericOptional) obj;
Optional os = go.getOptionalString();
}
स्थानीय चर os
type- बिना प्रकार Optional
है पैरामीटरString
! ग्रहण कंपाइलर ने निश्चित टाइप-पैरामीटर के बारे में जानकारी खो दी है। क्या किसी को पता है क्यों?
अब एक दूसरे कोड उदाहरण देखें:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional<?> go = (GenericOptional) obj;
Optional<String> os = go.getOptionalString();
}
विधि getOptionalString()
की वापसी प्रकार GenericOptional<?>
के रूप में स्थानीय चर go
घोषित करने से अब Optional<String>
है अपेक्षा के अनुरूप।
कोई भी इस व्यवहार को समझा सकता है?
उत्तर के लिए धन्यवाद। कोको ने वही जवाब दिया और मुझे नहीं पता कि आपको सही/सर्वोत्तम अनुमोदन दोनों कैसे देना है। इसलिए इस तथ्य के कारण कि आपने पहले प्रश्न का उत्तर दिया था, यहां तक कि आपने अपनी स्पष्टीकरण का समर्थन करने के लिए उदाहरण कोड प्रदान नहीं किया है, मैं आपको "सबसे सहायक" अनुमोदन दूंगा। अगर आपको लगता है कि कोको का जवाब उन लोगों के लिए अधिक मूल्यवान है जो जानना चाहते हैं कि यह कैसे काम करता है, तो मुझे नहीं दें और मैं कोको को "सबसे उपयोगी" अनुमोदन स्थानांतरित कर दूंगा। – Harmlezz