Android में Default interface methods: Nougat त्रुटि और इसका समाधान (Kotlin)

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: «अदृश्य» त्रुटि जो बिल्ड को तोड़ देती है

\n\n

आप Kotlin में एक ऐप लिख रहे हैं, सब कुछ ठीक चल रहा है, लेकिन अचानक — बैम! — Android Studio एक लाइन को लाल रंग में हाइलाइट करता है, और बिल्ड लॉग में एक भयावह संदेश दिखाई देता है:

\n\n
Default 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\n

Kotlin, एक आधुनिक भाषा होने के नाते, इस अवधारणा का पूरी तरह से समर्थन करता है। उदाहरण के लिए:

\n\n
interface 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 को लागू करता है, तो वह इस विधि को ओवरराइड नहीं कर सकता है, बल्कि «डिफ़ॉल्ट» कार्यान्वयन का उपयोग कर सकता है। सुविधाजनक है, है ना?

\n\n

समस्या यह है कि बाइट-कोड स्तर पर, Android में ऐसी विधियों को ऑपरेटिंग सिस्टम से समर्थन की आवश्यकता होती है। और यह समर्थन केवल Android 7.0 (Nougat, API 24) में आया।

\n\n

Android Studio में त्रुटि क्यों होती है?

\n\n

जब आप minSdkVersion को 24 से कम (जैसे, 21 या 23) सेट करते हैं, तो Android कंपाइलर देखता है कि आपका ऐप Android 6.0 या 5.0 वाले उपकरणों पर चल सकता है। और इन संस्करणों पर, डिफ़ॉल्ट इंटरफ़ेस विधियाँ वर्चुअल मशीन (Dalvik/ART) स्तर पर समर्थित नहीं हैं।

\n\n

यही कारण है कि कंपाइलर त्रुटि देता है:

\n\n
Default 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
\n\n

आप स्वयं default-विधियों वाले इंटरफ़ेस नहीं भी लिख सकते हैं — त्रुटि फिर भी दिखाई देगी यदि कोई निर्भरता उनका उपयोग करती है।

\n\n

त्रुटि कैसे ठीक करें? 3 सिद्ध तरीके

\n\n

आइए सभी संभावित समाधानों पर विचार करें — सबसे सरल से लेकर अधिक लचीले तक।

\n\n

तरीका 1: minSdkVersion को 24 तक बढ़ाएँ

\n\n

यह सबसे सीधा समाधान है। यदि आपके ऐप को Android 7.0 से पुराने उपकरणों का समर्थन करना आवश्यक नहीं है, तो बस build.gradle फ़ाइल (मॉड्यूल स्तर पर) में minSdkVersion बदलें:

\n\n
android {\n    ...\n    defaultConfig {\n        minSdkVersion 24\n        targetSdkVersion 34\n        ...\n    }\n}
\n\n

लाभ: तेज़, साफ

ब्लॉग

पुस्तक अनुशंसाएँ