मैं varargs heap pollution के बारे में पढ़ रहा था और मुझे वास्तव में यह नहीं पता कि कैसे वर्गार्ग या गैर-पुन: प्रयोज्य प्रकार उन समस्याओं के लिए जिम्मेदार होंगे जो पहले से ही सामान्यता के बिना मौजूद नहीं हैं। दरअसल, मैं बहुत आसानी से साथvarargs ढेर प्रदूषण: बड़ा सौदा क्या है?
public static void faultyMethod(String... l) {
Object[] objectArray = l; // Valid
objectArray[0] = 42; // ArrayStoreException thrown here
String s = l[0];
}
दूसरा एक बस सरणियों के सहप्रसरण, जो वास्तव में समस्या यहाँ है का उपयोग करता है
public static void faultyMethod(List<String>... l) {
Object[] objectArray = l; // Valid
objectArray[0] = Arrays.asList(42);
String s = l[0].get(0); // ClassCastException thrown here
}
बदल सकते हैं। (भले ही List<String>
पुन: प्रयोज्य था, मुझे लगता है कि यह अभी भी Object
का उप-वर्ग होगा और मैं अब भी किसी ऑब्जेक्ट को सरणी में असाइन करने में सक्षम हूं।) बेशक मैं देख सकता हूं कि दोनों के बीच थोड़ा अंतर है, लेकिन यह कोड दोषपूर्ण है चाहे वह जेनेरिक का उपयोग करता है या नहीं।
वे ढेर प्रदूषण से क्या मतलब है (यह मेरे स्मृति उपयोग लेकिन समस्या सिर्फ वे के बारे में संभावित प्रकार unsafetiness है बात के बारे में सोचना है), और यह कैसे सरणियों 'सहप्रसरण का उपयोग कर किसी भी प्रकार के उल्लंघन से अलग है?
अच्छा सवाल, मुझे लाइन ऑब्जेक्ट जोड़ने की अनुमति दें [0] = 42; वास्तव में ArrayStoreException फेंक रहा है। – Victor