कलाकारों को तकनीकी रूप से संभव है। यह आसानी से javac द्वारा सिद्ध नहीं किया जा सकता है कि आपके मामले में ऐसा नहीं है और JLS वास्तव में इसे एक वैध जावा प्रोग्राम के रूप में परिभाषित करता है, इसलिए त्रुटि को चिह्नित करना गलत होगा।
ऐसा इसलिए है क्योंकि List
यह एक इंटरफ़ेस है। तो आपके पास एक उपवर्ग हो सकता है Date
जो वास्तव List
में List
यहां के रूप में प्रच्छन्न है - और फिर इसे Date
पूरी तरह से ठीक होने के लिए कास्टिंग करना। उदाहरण के लिए:
public class SneakyListDate extends Date implements List<Foo> {
...
}
और तब:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
इस तरह के परिदृश्य का पता लगाना हमेशा संभव नहीं हो सकता है, क्योंकि यह रनटाइम जानकारी की आवश्यकता होगी यदि उदाहरण से आ रहा है, उदाहरण के लिए, इसके बजाय एक विधि। और यहां तक कि अगर, यह संकलक के लिए बहुत अधिक प्रयास की आवश्यकता होगी। कंपाइलर केवल उन जातियों को रोकता है जो क्लास-ट्री के लिए बिल्कुल भी मैच नहीं होने के कारण बिल्कुल असंभव हैं। जो यहाँ नहीं है, जैसा कि देखा गया है।
ध्यान दें कि JLS को एक मान्य जावा प्रोग्राम होने के लिए आपके कोड की आवश्यकता होती है। में 5.1.6.1। अनुमत संकीर्ण रूपांतरण संदर्भ यह कहता है:
एक संकुचन संदर्भ रूपांतरण संदर्भ प्रकार से मौजूद S
संदर्भ प्रकार के T
अगर सभी निम्न में से हैं सच :
- [...]
- एक निम्नलिखित मामलों के लिए लागू होता है :
- [...]
S
एक इंटरफ़ेस प्रकार है, T
एक वर्ग प्रकार है, और T
एक final
वर्ग का नाम नहीं है ।
यहां तक कि अगर कंपाइलर यह पता लगा सकता है कि आपका मामला वास्तव में असंभव है, तो उसे त्रुटि चिह्नित करने की अनुमति नहीं है क्योंकि जेएलएस इसे वैध जावा प्रोग्राम के रूप में परिभाषित करता है।
इसे केवल एक चेतावनी दिखाने की अनुमति होगी।
List
।Date d = (Date) new Object();