2011-08-24 20 views
7

का नाम देता है मैं कोड का एक टुकड़ा लिख ​​रहा हूं जिसमें मुझे एक ऑब्जेक्ट डालना है यदि यह किसी निश्चित वर्ग का उदाहरण है।

सामान्य रूप से मैं संगतता की जांच के लिए instanceof का उपयोग कर रहा हूं।

समस्या यह है कि चेक कभी संतुष्ट नहीं होता है क्योंकि वस्तुएं "अजीब" वर्गों से संबंधित होती हैं।

उदाहरण के लिए; जब मैं इस ऑब्जेक्ट पर getClass().getSimpleName() विधि को कॉल करता हूं तो यह मुझे कक्षा + $* (उदा। ViewPart के बजाय) का नाम देता है।

यह $* का अर्थ क्या है? क्या कोई समाधान या समाधान है?

+1

क्या यह एक अनोखी आंतरिक कक्षा है? – Heisenbug

उत्तर

14

जो आंतरिक वर्ग दिखाता है (या तो अज्ञात (यदि उसके पास कोई संख्या है) या नाम दिया गया है)। उदाहरण के लिए:

class Foo { 
    static class Bar { 
    } 
} 

वर्ग Foo.Bar के नाम Foo$Bar है। अब अगर हम था:

class Foo { 

    static void bar() { 
     Runnable r = new Runnable() { 
      public void run() {}; 
     }; 

     System.out.println(r.getClass()); 
    } 
} 

Foo$1 प्रिंट होगा कि।

आप जावैक द्वारा बनाई गई कक्षा फ़ाइलों के नामकरण में समान प्रभाव देख सकते हैं।

4

ये anonymous class के उदाहरण हैं। ViewPart$1ViewPart के अंदर परिभाषित पहली अनाम कक्षा है - लेकिन इसका मतलब यह नहीं है कि यह ViewPart का उप-वर्ग है। यह संभवतः कुछ श्रोता इंटरफ़ेस का एक अप्रिय कार्यान्वयन है।

+0

क्या यह इस तथ्य को दस्तावेज करता है कि 'कक्षा $ X'' एक्स' गुमनाम वर्ग को इंगित करता है? –

+0

@Hablutzel: नहीं, जेएलएस केवल इतना कहता है कि नाम प्रारूप होना चाहिए, $ अंकों के बाद। अंकों का अनुक्रम संकलक का कार्यान्वयन विवरण है। –

1

$ आंतरिक कक्षा के लिए इंगित करता है। उदाहरण के लिए दो वर्गों

public class TopClass { 
    class SubClass { 
    // some methods 
    }// inner class end 
} // outer class end 

पर विचार आप इस कोड को आप दो वर्ग फ़ाइलों TopClass.class और TopClass $ SubClass.class मिल जाएगा संकलन है।

अपनी व्यूपार्ट क्लास की जांच करें कि इसमें कोई आंतरिक कक्षा है या नहीं। उम्मीद है कि यह मदद करता है।

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