Android Studio - अस्पष्ट विधि कॉल getClass ()


130

मैं अपने Android एप्लिकेशन के लिए Android स्टूडियो का उपयोग कर रहा हूं।
मेरा कोड काम करता है और संकलित करता है।
हाल ही में, IDE ने मुझे निम्न कोड के getClass पर त्रुटि (लाल रेखाएं) दिखाई:

fragment.getClass().getSimpleName()

लेकिन फिर भी आवेदन संकलन और चलता है।
त्रुटि है:

Ambiguous method call. Both
getClass () in Object and
getClass () in Object match.

क्या कोई मुझे समझा सकता है कि यह क्या है? और कोड अभी भी क्यों चल रहा है?



मुझे वही त्रुटि मिलती है, लेकिन मैं अभी भी एप्लिकेशन को इकट्ठा कर सकता हूं और ठीक चला सकता हूं।
जेसन रॉबिन्सन

जवाबों:


255

मुझे लगता है कि यह एंड्रॉइड स्टूडियो में एक बग है। जैसा कि हम जानते हैं कि एंड्रॉइड स्टूडियो इंटेलीज प्लेटफॉर्म और इंटेलीज आईडीईए कम्युनिटी एडिशन की मौजूदा कार्यक्षमता पर आधारित है।

Google ने इसे JetBrains के सहयोग से विकसित किया है। और उसी बग को IntelliJ में भी होने की सूचना है। त्रुटि रिपोर्ट पर एक नजर है

केवल वैकल्पिक हल इस मुद्दे पर उदाहरण आप फोन कास्ट करने के लिए है getClass(), पर करने के लिए Objectइस प्रकार है:

((Object) this).getClass()

20
अब कोई फर्क नहीं पड़ता ... SOUCH UPVOTES :)
सैम

1
@ रीतेशगुन मेरा जवाब नीचे देखें
जेम्स वाल्ड

11
IDE में बग के चारों ओर काम करने के लिए कोड को संशोधित करना अधिक समाधान नहीं है।
बजे जेफरी ब्लाटमैन

2
यह काम नहीं करता है, या कम से कम वर्तमान में नहीं है (एंड्रॉइड स्टूडियो 0.8.9)
कोनराड मोरावस्की

2
एक साल से अधिक समय बाद और यह अभी भी तय नहीं है :(
काई

73

अपना एप्लिकेशन कोड संशोधित करने के बजाय, आप अपने Android SDK के स्रोत कोड को पैच करके इस बग से बच सकते हैं ।

जब आप getClass () त्रुटि के पार आते हैं, तो विधि की घोषणा (मैक पर acrossB) पर जाएं। यह जैसे पथ पर नेविगेट करेगा $ANDROID_HOME/sources/android-20/java/lang/Object.java। अब, IntelliJ या Android Studio के भीतर:

  • Object.javaचयन करके योग्य बनाएं File -> Make File Writable। यदि आप फ़ाइल को संपादित करने का प्रयास करते हैं तो आपको स्वचालित रूप से ऐसा करने के लिए कहा जा सकता है।
  • अनबाउंड वाइल्डकार्ड निकालें:

    // http://youtrack.jetbrains.com/issue/IDEA-72835 से बचने के लिए अनबाउंड वाइल्डकार्ड (क्लास) निकाला गया सार्वजनिक अंतिम मूल वर्ग getClass () ;

एंड्रॉइड स्टूडियो के नए संस्करण एक बग से पीड़ित दिखाई देते हैं जो आपको फ़ाइल को संपादन योग्य घोषित करने के बाद भी संपादित करने से रोकता है। इसके बजाय, पथ की प्रतिलिपि बनाएँ,Edit -> Copy Path या ⇧⌘C की बनाएँ, और इसे अपने पसंदीदा संपादक में संपादित करें।

यह परिवर्तन स्रोत नेविगेशन कार्यक्षमता को संरक्षित करेगा। अन्य विकल्प:

  • आप पूरी टिप्पणी कर सकते हैं getClass() घोषणा पर ।
  • आप Object.javaफ़ाइल के नाम पर एक गैर-जावा एक्सटेंशन जोड़ सकते हैं , जैसे Object.java.in

जेम्स वाल्ड, अच्छा जवाब, + 1
रितेश गुने

2
वास्तव में मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए।
थॉमस केलर

1
इस तथ्य को प्रतिबिंबित करने के लिए उत्तर अपडेट करें कि एंड्रॉइड स्टूडियो में बग है, जो Object.javaकेवल-पढ़ने के लिए ध्वज को साफ़ करने के बाद भी संपादित करने की अनुमति नहीं देता है।
जेम्स वाल्ड

2
यहाँ है एंड्रॉयड स्टूडियो बग रिपोर्ट।
फिल

केवल गेटक्लास पद्धति पर टिप्पणी करने से IntelliJ / Studio को शिकायत होती है instance.getClass()(केवल getClass()काम करता है)। Object.javaयह अक्षम करने के लिए फ़ाइल का नाम बदलना काम करता है।
पियरे-ल्यूक पाऊर

9

एक वस्तु के लिए अपने "getClass" का उपयोग करें

((Object) this).getClass()

टुकड़े के साथ इस समस्या वाले लोगों के लिए, का उपयोग करें

((Object) fragment).getClass()

3
वास्तव में, आप getClass () परिणाम नहीं डालते हैं, आप उस वस्तु को डालते हैं जिसमें आप अभी (इस) को एक वस्तु के रूप में माना जाता है।
जॉर्ज एगुइलर

6
यह संभवतः जावा आईडीई द्वारा आवश्यक अब तक के सबसे बदनाम वर्कअराउंड के लिए स्वर्ण पदक के योग्य है। एक जावा ऑब्जेक्ट को ऑब्जेक्ट कास्टिंग करना, प्रभावशाली रिक्तता।
स्निकोलस

8

सबसे पहले संबंधित Android Studio समस्या यहाँ है । कृपया इसे घूरें ताकि यह कुछ ध्यान दे सके!

इसके अलावा संबंधित IntelliJ मुद्दा यहाँ है

इसके लिए एक अच्छा समाधान यह है कि इसका नाम बदल <sdk>/android-<platform>/java/lang/Object.javaदिया जाएObject.java.XXXउदाहरण के लिए । यह एएस को इसे देखने से रोकेगा और समस्या से बचा जाएगा। बेशक, ऐसा करने से आप आसानी से एएस के भीतर से ऑब्जेक्ट के स्रोत पर आसानी से नहीं जा सकते।

आप फ़ाइल को उसके मूल नाम पर वापस रख सकते हैं जब यह बग ठीक हो जाएगा ...


2

आज मैं उसी समस्या में भाग गया जब मैंने एक नई परियोजना बनाई। मैंने एक अन्य परियोजना की तुलना में, जिसमें यह समस्या नहीं थी और एक अंतर पाया। पुराने प्रोजेक्ट को "एंड्रॉइड 4.2.2" के खिलाफ बनाया गया था, जबकि नया डिफ़ॉल्ट रूप से "एंड्रॉइड एपीआई 19 प्लेटफॉर्म" पर सेट था। मैंने इसे "एंड्रॉइड 4.2.2" में बदल दिया, जो एपीआई 17 के बराबर है और लाल त्रुटि मार्कर गायब हो गया। एपीआई 17 मेरी परियोजना के लिए पर्याप्त है इसलिए मैं इसे इस तरह छोड़ सकता हूं। मुझे नहीं पता कि यह समस्या का समाधान क्यों करता है, ईमानदार होने के लिए।


1

मुझे इसके लिए एक फिक्स मिला, कम से कम मेरे अंत पर। यह निश्चित रूप से एक इंटेलीज बग है, लेकिन यह सोर्सपाथ में कक्षाओं के बीच और एंड्रॉइड एसडीके के लिए क्लासपाथ में संघर्ष के कारण होता है।

यदि आप प्रोजेक्ट स्ट्रक्चर> SDKs> {{Your Android SDK}} पर जाते हैं, तो Sourcepath टैब से किसी भी एंड्रॉइड एंट्री को हटा दें। इस समाधान के साथ समस्या यह है कि अब आपके पास IntelliJ / Android Studio से स्रोतों तक सीधी पहुंच नहीं है।

मैंने Jetbrains जारी ट्रैकर पर एक ही जानकारी पोस्ट की है , इसलिए उम्मीद है कि हम जल्द ही एक सुधार देखेंगे।


अब एक तय है। इसे संभवतः
v0.9.3

1

बस टुकड़ा का उपयोग करें ।class.getSimpleName ();

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.