हम वर्तमान में जावा 7 से जावा 8 तक किसी एप्लिकेशन को माइग्रेट करने की प्रक्रिया में हैं। कुछ संकलन समस्याओं को ठीक करने के बाद, मैंने निम्नलिखित प्रश्न के समान एक समस्या पर ठोकर खाई: ClassCast Error: Java 7 vs Java 8।अस्पष्ट विधि कॉल का पता कैसे लगाएं जो जावा 8 में क्लासकास्ट अपवाद का कारण बनता है?
public class Test {
public static void main(String[] args) {
System.out.println(String.valueOf(getVal("xxx"))); // 7: prints the result, 8: Exception
}
@SuppressWarnings("unchecked")
public static <T> T getVal(String param) {
// do some computation based on param...
return (T) result; // actual return type only depends on param so the caller knows what to expect
}
}
विचार हम जोर होता है कि कि फोन करने वाले की उम्मीद प्रकार जानता था, और यह उसे एक स्पष्ट कलाकारों से बच जाएंगे (मैं:
संक्षेप में, यहाँ एक नमूना कोड कि इस मुद्दे से पता चलता है यह मत कहें कि यह एक अच्छा विचार था ...)। कई मामलों में, कॉलर को सिर्फ Object
की उम्मीद है, इसलिए कोई अंतर्निहित कलाकार नहीं था।
ऊपर दिए गए प्रश्न में बताया गया है कि String.valueOf
उदाहरण जावा 7 में ठीक काम करता है क्योंकि कोई प्रकार अनुमान नहीं था, इसलिए Object
माना गया था। अब जावा 8 में, कंपाइलर सबसे विशिष्ट प्रकार चुनता है (यहां char[]
), जो रनटाइम पर ClastCastException
का कारण बनता है।
समस्या यह है कि हमारे पास इस getVal
विधि के लगभग 350 कॉल हैं। क्या ओवरलोडेड विधि कॉल का पता लगाने का कोई तरीका है जो जावा 7 और जावा 8 के बीच अलग होगा? आईई। पता लगाएँ कि जावा 8 कंपाइलर जावा 7 कंपाइलर से एक अलग विधि का चयन करेगा।
हमारे पास एक समान विधि थी जिसे सैकड़ों स्थानों में भी बुलाया गया था। मैंने इसे अतिरिक्त 'कक्षा क्लैज' पैरामीटर पेश करने की जगह बदल दी। इस तरह से आप एक स्पष्ट त्रुटि हैंडलिंग कर सकते हैं: या तो शून्य वापस या कुछ और विशिष्ट अपवाद फेंक दें। मैंने इसे मैन्युअल रूप से आधे घंटे की तरह खर्च किया। मैं आपको ऐसा करने की सलाह देता हूं। मुझे नहीं पता कि इसे कैसे स्वचालित किया जाए, इस प्रकार यह आपके प्रश्न के उत्तर के रूप में योग्य नहीं है। –
एक साधारण उत्तर है: * "अनचेक" चेतावनियां दबाएं *। वे पहले से ही आपको बताते हैं कि आपका कोड गलत है। यदि आप अब अपना कोड ठीक करना चाहते हैं कि यह बहुत देर हो चुकी है, तो बस '@SuppressWarnings ("अनचेक") की घटनाओं की खोज करें ... – Holger
@ होल्गर क्या आप कृपया 2011 में इसे लागू करने के दौरान अपने सहयोगी को बता सकते हैं? ;-) मुझे पहले से ही पता था कि यह पहली जगह में एक बुरा विचार था (हालांकि यह उतना बुरा नहीं है जितना अब जावा 8 में है)। साथ ही, विधि कॉल पर स्वयं '@ SuppressWarnings' नहीं है, यह केवल 'getVal' की घोषणा में है। इस एनोटेशन को हटाने से इस प्रकार कोई समस्याग्रस्त उपयोग नहीं दिखाया जाएगा। –