2012-04-30 20 views
64

मेरे पास एक सार्वजनिक सार वर्ग है और मैं getClass() विधि का उपयोग करने की कोशिश कर रहा हूं, क्योंकि मुझे अपनी अमूर्त कक्षा को विस्तारित करने वाली कक्षा से जानकारी की आवश्यकता होगी। एक उदाहरण यह है:अमूर्त वर्ग में getClass() संदिग्ध विधि कॉल

public String getName() { 
    return getClass().getSimpleName(); 
} 

हालांकि, इंटेलीजे इस रिपोर्ट:

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

कोड ठीक चलाता है, लेकिन मेरी आईडीई में त्रुटि चेतावनी के दसियों होने मेरे रास्ते में थोड़े है। यह मेरे काम प्रवाह को बहुत झूठी सकारात्मकताओं से बाधित करता है।

इन त्रुटियों को क्यों दिखाया गया है, और मैं उन्हें देखने के लिए क्या कर सकता हूं?

+12

इंटेलिजे – MRalwasser

+2

में एक बग की तरह दिखता है मुझे पुराने तरीके से बुलाओ, लेकिन मुझे नहीं पता कि आपको कंक्रीट क्लास को क्यों जानना होगा। आभासी तरीकों को नौकरी करना चाहिए। –

+0

@IgorF। आदर्श रूप से, हाँ। जैसा कि मैंने कहा, मेरा उदाहरण आसानी से बदला जा सकता है। लेकिन मेरे सभी तरीकों में आसान समकक्ष नहीं हैं। वैसे भी यह मुद्दा नहीं है। आपकी टिप्पणी के बाद – Matsemann

उत्तर

43

कोड ठीक है, लेकिन यह IntelliJ में एक त्रुटि है।

Error report, another one

इस समस्या के विभिन्न बदलावों के साथ कुछ और त्रुटि रिपोर्ट भी हैं। चूंकि डफिमो ने टिप्पणियों में बताया, यह भी हो सकता है क्योंकि क्लासपाथ में जेडीके के विभिन्न संस्करण हैं।

+0

ऐसा लगता है कि मुझे एक ही समस्या है, क्या आपको कोई कामकाज मिला? – Budda

+1

नहीं, साइट का कहना है कि यह आपके क्लासस्पैट में कई जेडीके होने के कारण होता है। सफाई करना समस्या को हल करता है। आपके हिस्से पर गरीब हाउसकीपिंग। – duffymo

+0

@ डफिमो यदि आप * कुछ लोगों * के लिए समस्या को हल करने वाले लिंक को पढ़ते हैं, फिर भी अन्य लोगों को अन्य मामलों में समस्या है। और ज्यादातर लोगों के लिए यह केवल एक अद्यतन के बाद हुआ, यह सुझाव देता है कि यह ठीक से पहले काम कर सकता है। – Matsemann

93

इस

((Object) this).getClass() 

तरह कास्टिंग Object करने के लिए अपने getClass() कॉल मेरे लिए समस्या (गैर सार वर्गों के साथ) को हल करती है। यह अच्छा नहीं है, लेकिन यह काम कर रहा है।

इसके अलावा, प्रोजेक्ट सेटिंग्स से अपने एंड्रॉइड एसडीके को मैनिपुलेट करना और आपके एंड्रॉइड एसडीके से सभी जेडीके जार को हटाने से त्रुटि हल हो जाती है। बेशक आपको फिक्स का उपयोग करने के लिए अपनी परियोजना के भीतर इसका संदर्भ देना होगा।

+7

अविश्वसनीय बदसूरत लेकिन यह काम कर रहा है। धन्यवाद! –

+2

यह मेरे लिए सार कक्षाओं में भी हल करता है। –

+2

आईडीईए को ठीक करने की आवश्यकता है, हमारे कोड को हैक न करें और इसे उलझन में देखें। this.anyMethod() के इसके परिणाम हैं। – Sileria

3

मैंने देखा कि यह एंड्रॉइड संस्करण पर निर्भर करता है कि आप संदर्भ दे रहे हैं कि त्रुटि होती है या नहीं। मैं से pom.xml में Android 4.1.1.4 के लिए निर्भरता परिभाषित करता था।

<dependency> 
    <groupId>com.google.android</groupId> 
    <artifactId>android</artifactId> 
    <version>4.1.1.4</version> 
    <scope>provided</scope> 
</dependency> 

इस बीच, मैं maven-android-sdk-deployer का उपयोग कर की जरूरत निर्भरता प्रदान करते हैं।

<dependency> 
    <groupId>android</groupId> 
    <artifactId>android</artifactId> 
    <version>4.3_r1</version> 
    <scope>provided</scope> 
</dependency> 

फिर getClass() त्रुटि पैदा करता है।

public Class<?> type() { 
    return super.getClass(); 
} 

या एक स्थिर पुन: प्रयोज्य util:

5

एक और काम कर समाधान का एक सहायक विधि उत्पन्न करने के लिए कक्षा प्राप्त करने के लिए है

public static final Class<?> type(Object object) { 
    return object.getClass(); 
} 
1

अगर आप Maven के साथ एक Android परियोजना है यह तब हो सकता, और आप प्रोजेक्ट एसडीके के रूप में का उपयोग करके इंटेलिजे में आयात करते हैं। समस्या यह है कि और एंड्रॉइड मेवेन निर्भरता जार में java.lang.Object कक्षा शामिल है।>Maven एंड्रॉयड प्लेटफार्म - ->क्लासपाथ>मंच सेटिंग - ->एसडीके

वैकल्पिक हल परियोजना संरचना को goint है। यह वास्तव में जेडीके में मौजूद सभी जारों की सूची देगा। उन सभी को हटा दें, इसलिए केवल दो एंड्रॉइड निर्भरता बनी हुई है (res और annotations.jar)।

संपादित: यह समस्या पहले से ही reported इंटेलीजे समस्या ट्रैकर के लिए लंबे समय पहले किया गया है।

संबंधित मुद्दे