संकलनकर्ता अनायास रूपांतरण प्रदर्शन कर सकते हैं, वे तो बस के लिए नहीं निर्दिष्ट क्योंकि सामान्य सरणियों व्यवहार नहीं कर सकते हैं गैर-जेनेरिक सरणी की तरह।
एक सरणी जिसका प्रकार A[]
, जहां A
एक संदर्भ प्रकार, सरणी के एक घटक के लिए एक काम है कि मूल्य निर्धारित किये जाने से आबंटित है रन टाइम पर चेक किया गया है सुनिश्चित करने के लिए है के लिए:
10.5. Array Store Exception देखें घटक के लिए।
यदि आवंटित मूल्य का प्रकार असाइनमेंट नहीं है-घटक प्रकार के साथ संगत, ArrayStoreException
फेंक दिया गया है।
यदि किसी सरणी का घटक प्रकार पुनः प्राप्त करने योग्य नहीं था, तो जावा वर्चुअल मशीन पिछले अनुच्छेद में वर्णित स्टोर चेक नहीं कर सका। यही कारण है कि गैर-पुन: प्रयोज्य तत्व प्रकार के साथ एक सरणी निर्माण अभिव्यक्ति प्रतिबंधित है।
एक List<MyDTO>[]
अगर हम इसे में List
के कुछ अन्य प्रकार डाल फेंक नहीं होगा, तो यह एक सरणी के रूप में व्यवहार नहीं करता है। उद्धरण से अंतिम वाक्य पर ध्यान दें: "यही कारण है कि एक गैर-पुन: प्रयोज्य तत्व प्रकार के साथ एक सरणी निर्माण अभिव्यक्ति प्रतिबंधित है।" यही कारण है, ऐसा होना निर्दिष्ट है। (और, रिकॉर्ड, this reasoning has always existed के लिए, तो यह मौजूद था जब सवाल 2011 में पोस्ट किया गया था)
हम अभी भी यह कर सकते हैं:
@SuppressWarnings({"unchecked","rawtypes"})
List<MyDTO>[] dtoLists = new List[] {
new ArrayList<MyDTO>(), anExistingDtoList
};
या इस:
@SuppressWarnings("unchecked")
List<MyDTO>[] dtoLists = (List<MyDTO>[]) new List<?>[] {
new ArrayList<MyDTO>(), anExistingDtoList
};
(स्थिर रूप से तर्क प्रकारों की जांच करने के अलावा, varargs चीज समतुल्य है: creates a List[]
और suppresses warnings।)
अब, निश्चित रूप से, विनिर्देशन बदला जा सकता है जैसे कुछ "अगर मूल्य का प्रकार असाइनमेंट नहीं है- के साथ संगत कच्चे प्रकार का घटक प्रकार ...", लेकिन बिंदु क्या है? यह कुछ असामान्य परिस्थितियों में कुछ हद तक पात्रों को बचाएगा लेकिन अन्यथा उन लोगों के लिए चेतावनियों को दबाएगा जो प्रभाव को नहीं समझते हैं।
इसके अलावा, the tutorial और अन्य सामान्य स्पष्टीकरण जो मैंने देखा है, यह प्रदर्शित नहीं करता है कि टाइप सिस्टम कोविरिएंट सरणी में कैसे बेक किया गया है।
// (declaring our own because Arrays.fill is defined as
// void fill(Object[], Object)
// so the next examples would more obviously pass)
static <T> void fill(T[] arr, T elem) {
Arrays.fill(arr, elem);
}
आप जानते हैं कि इस संकलित:
उदाहरण के लिए, निम्नलिखित घोषणा दिए गए?
// throws ArrayStoreException
fill(new String[1], new Integer(0));
और यह भी संकलित:
static <T, U extends T> void fill(T[] arr, U elem) {...}
लेकिन वह केवल एक था:
// doesn't throw ArrayStoreException
fill(dtoLists, new ArrayList<Float>());
जावा 8 से पहले, हम उन कॉल करने के लिए fill
यह निम्नलिखित घोषणा देकर असफल बना सकता है प्रकार अनुमान के साथ समस्या, और अब यह List<MyDTO>[]
में अंधेरे से List<Float>
डालने "सही ढंग से" काम करता है।
इसे ढेर प्रदूषण कहा जाता है। यह कुछ समय बाद फेंकने के लिए ClassCastException
का कारण बन सकता है, संभवतः कहीं भी समस्या के कारण पूरी तरह से असंबंधित होने की संभावना है। List
जैसे जेनेरिक कंटेनर के साथ हीप प्रदूषण raw types का उपयोग करने जैसी अधिक स्पष्ट असुरक्षित कार्रवाइयों की आवश्यकता है, लेकिन यहां, हम ढेर प्रदूषण को स्पष्ट रूप से और बिना किसी चेतावनी के कारण बना सकते हैं।
जेनेरिक सरणी (और वास्तव में, सामान्य रूप से सरणी) केवल हमें परिस्थितियों में सबसे सरल जांच देते हैं।
तो यह स्पष्ट है कि भाषा डिजाइनरों ने सोचा था कि उन्हें केवल उन्हें अनुमति देने के लिए बेहतर नहीं था, और प्रोग्रामर जो वे मौजूद समस्याओं को समझते हैं, वे चेतावनियों को दबा सकते हैं और प्रतिबंध को बाधित कर सकते हैं।
[जेनेरिक सूची के ऐरे] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7810074/array-of-generic-list) – Thilo
उस डुप्लिकेट पर शीर्ष उत्तर देखें। इसमें एक उदाहरण है कि इसकी अनुमति क्यों नहीं है। – Thilo
यह एक डुप्लिकेट नहीं है। मेरा प्रश्न संकलक डिजाइन मुद्दों से संबंधित उत्तरों के लिए पूछता है। –