परिचय: «अदृश्य» त्रुटि जो बिल्ड को तोड़ देती है
\n\nआप Kotlin में एक ऐप लिख रहे हैं, सब कुछ ठीक चल रहा है, लेकिन अचानक — बैम! — Android Studio एक लाइन को लाल रंग में हाइलाइट करता है, और बिल्ड लॉग में एक भयावह संदेश दिखाई देता है:
\n\nDefault interface methods are only supported starting with Android 7.0 (Nougat)\n\nपरिचित स्थिति है? यदि आप Android डेवलपमेंट में नए हैं, तो यह त्रुटि एक वास्तविक पहेली की तरह लग सकती है। आप तो बस डिफ़ॉल्ट विधि वाले इंटरफ़ेस का उपयोग कर रहे हैं — इसमें गलत क्या हो सकता है?
\n\nवास्तव में, समस्या आपके ऐप के minSdkVersion और Kotlin भाषा की क्षमताओं (जो आंतरिक रूप से Java 8 की सुविधाओं का उपयोग करती है) के बीच असंगतता में निहित है।
\n\nइस लेख में, हम समझेंगे कि यह त्रुटि क्यों होती है, इसे कैसे ठीक किया जाए, और पुराने उपकरणों के समर्थन को खोए बिना आधुनिक कोड कैसे लिखा जाए। चलिए शुरू करते हैं!
\n\n«default interface method» क्या है और यह क्यों आया?
\n\nमूल बातों से शुरू करते हैं। Java के पुराने संस्करणों (8 से पहले) में, इंटरफ़ेस में केवल विधियों की घोषणाएँ हो सकती थीं — बिना कार्यान्वयन के। लेकिन Java 8 के आगमन के साथ, इंटरफ़ेस में बॉडी वाली विधियाँ (तथाकथित डिफ़ॉल्ट विधियाँ) जोड़ने की संभावना आई।
\n\nKotlin, एक आधुनिक भाषा होने के नाते, इस अवधारणा का पूरी तरह से समर्थन करता है। उदाहरण के लिए:
\n\ninterface Logger {\n fun log(message: String)\n fun logWithTimestamp(message: String) {\n log("${System.currentTimeMillis()}: $message")\n }\n}\n\nयहाँ logWithTimestamp एक default interface method है। यदि कोई क्लास Logger को लागू करता है, तो वह इस विधि को ओवरराइड नहीं कर सकता है, बल्कि «डिफ़ॉल्ट» कार्यान्वयन का उपयोग कर सकता है। सुविधाजनक है, है ना?
समस्या यह है कि बाइट-कोड स्तर पर, Android में ऐसी विधियों को ऑपरेटिंग सिस्टम से समर्थन की आवश्यकता होती है। और यह समर्थन केवल Android 7.0 (Nougat, API 24) में आया।
\n\nAndroid Studio में त्रुटि क्यों होती है?
\n\nजब आप minSdkVersion को 24 से कम (जैसे, 21 या 23) सेट करते हैं, तो Android कंपाइलर देखता है कि आपका ऐप Android 6.0 या 5.0 वाले उपकरणों पर चल सकता है। और इन संस्करणों पर, डिफ़ॉल्ट इंटरफ़ेस विधियाँ वर्चुअल मशीन (Dalvik/ART) स्तर पर समर्थित नहीं हैं।
यही कारण है कि कंपाइलर त्रुटि देता है:
\n\nDefault interface methods are only supported starting with Android 7.0 (Nougat)\n\n
यह सचमुच कहता है: «मैं इस कोड को संकलित नहीं कर सकता क्योंकि आपका ऐप ऐसे डिवाइस पर चल सकता है जो ऐसी विधियों को निष्पादित नहीं कर सकता»।
\n\nविशिष्ट परिदृश्य जब ऐसा होता है
\n\nअक्सर, त्रुटि दो मामलों में होती है:
\n\n- \n
- Kotlin संग्रहों का उपयोग (जैसे,
listOf,mapOf) — इनमें डिफ़ॉल्ट विधियाँ होती हैं। \n - तृतीय-पक्ष पुस्तकालयों का उपयोग जिनमें आंतरिक रूप से डिफ़ॉल्ट विधियों वाले इंटरफ़ेस होते हैं। \n
- Android Jetpack के साथ काम करना (जैसे,
LifecycleObserverयाDefaultLifecycleObserver)। \n
आप स्वयं default-विधियों वाले इंटरफ़ेस नहीं भी लिख सकते हैं — त्रुटि फिर भी दिखाई देगी यदि कोई निर्भरता उनका उपयोग करती है।
\n\nत्रुटि कैसे ठीक करें? 3 सिद्ध तरीके
\n\nआइए सभी संभावित समाधानों पर विचार करें — सबसे सरल से लेकर अधिक लचीले तक।
\n\nतरीका 1: minSdkVersion को 24 तक बढ़ाएँ
\n\nयह सबसे सीधा समाधान है। यदि आपके ऐप को Android 7.0 से पुराने उपकरणों का समर्थन करना आवश्यक नहीं है, तो बस build.gradle फ़ाइल (मॉड्यूल स्तर पर) में minSdkVersion बदलें:
android {\n ...\n defaultConfig {\n minSdkVersion 24\n targetSdkVersion 34\n ...\n }\n}\n\nलाभ: तेज़, साफ