कलाकारों को तकनीकी रूप से संभव है। यह आसानी से 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();