2014-12-11 5 views
6

के विभिन्न संस्करणों में संकुल में संरक्षित आंतरिक वर्ग दृश्यता में मतभेद आज मैं अपने एंड्रॉइड कोडबेस में इस मुद्दे पर आया जिसने मुझे कुछ समय के लिए & मेरे सहकर्मियों को परेशान किया। हम पहले तो जैसे एक वर्ग संरचना था:एंड्रॉइड

Foo.java

package test.a; 

public abstract class Foo extends View { 
    protected abstract class InnerFoo { 
     public InnerFoo() {} 
    } 
    protected class Cog { 
     public Cog() {} 
    } 
} 

Bar.java

package test.a; 

public class Bar extends Foo { 
    private abstract class AbstractInnerBar extends InnerFoo { 
     protected abstract void someMethod(); 
    } 
    private class InnerBar extends AbstractInnerBar { 
     Cog myCog; 
     public InnerBar() { 
      myCog = new Cog(); 
     } 
     protected void someMethod() {} 
    }   
} 

मैं समझता हूँ कि इस वर्ग संरचना जरूरी आसान नहीं है, लेकिन यह समस्याओं के बिना काम किया। हालांकि, हमने हाल ही में कुछ पैकेज पुनर्गठन किया और महसूस किया कि बार कहीं और संबंधित था। इसलिए, हम इसे एक अलग पैकेज में ले गए और लगभग दो अलग-अलग पैकेजों के साथ लगभग एक ही संरचना है। java.lang.IllegalAccessError: tried to access class test.a.Foo$Cog[] from class test.b.Bar$InnerBar:

Foo.java

package test.a; 

public abstract class Foo extends View { 
    protected abstract class InnerFoo { 
     public InnerFoo() {} 
    } 
    protected class Cog { 
     public Cog() {} 
    } 
} 

Bar.java

package test.b; //This is the only change 

public class Bar extends Foo { 
    private abstract class AbstractInnerBar extends InnerFoo { 
     protected abstract void someMethod(); 
    } 
    private class InnerBar extends AbstractInnerBar { 
     Cog myCog; 
     public InnerBar() { 
      myCog = new Cog(); 
     } 
     protected void someMethod() {} 
    }   
} 

अजीब बात यह है कि पर परिवर्तन के बाद एंड्रॉयड के कुछ संस्करणों हम की तरह त्रुटियों मिलता है। मुझे नहीं लगता कि यह एक समस्या होगी क्योंकि Cogprotected दृश्यता, Bar extends Foo और InnerBarInnerFoo बढ़ाता है। आश्चर्यजनक रूप से, एंड्रॉइड के अन्य संस्करण ठीक काम करते हैं (कोई त्रुटि नहीं, कोई दृश्यता समस्या नहीं है)। हम Cog को public के रूप में घोषित करके इस मुद्दे को हल करने में सक्षम हैं, लेकिन यह एक अनावश्यक कामकाज की तरह लगता है।

हमने एंड्रॉइड 4.4.4 चलाने वाले मोटोरोला मोटो एक्स (पहली पीढ़ी डेवलपर संस्करण) पर समस्या देखी। हमें नेक्सस 5 चलने वाले लॉलीपॉप या एंड्रॉइड 4.1 पर चलने वाले नेक्सस एस पर समस्या नहीं थी 4.1.2

क्या कोई इस पर प्रकाश डाल सकता है?

+0

क्या आप अभी भी त्रुटि प्राप्त करते हैं यदि आप एपीके को तैनात करने से पहले अपनी परियोजना को साफ करते हैं? –

+0

निश्चित रूप से अभी भी एक साफ के बाद त्रुटि प्राप्त करें। मैंने एक सहयोगी को अपनी मशीन पर एक एपीके भी बनाया है, इसे बिना किसी समस्या के अपने फोन (नेक्सस 5/लॉलीपॉप) पर चलाएं, फिर एडीबी मोटो एक्स/केके पर एक ही एपीके इंस्टॉल करें और यह दुर्घटनाग्रस्त हो जाए। – loopyzort

उत्तर

0

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

public abstract class Foo{} 
+0

धन्यवाद varun, अच्छी पकड़! दुर्भाग्यवश, जब मैंने प्रश्न टाइप किया था तो यह एक अनुवाद त्रुटि थी (मैंने अपने स्रोत को फू/बार उदाहरण के साथ बदल दिया)। हमारा कोड वास्तव में फू क्लास को 'सार्वजनिक सार' के रूप में घोषित करता है। मैंने स्रोत को मूल प्रश्न में अद्यतन किया है। – loopyzort

+0

यदि आप फू को जनता के रूप में घोषित कर रहे हैं तो कोई समस्या नहीं होनी चाहिए क्योंकि कोग फू के संरक्षित सदस्य हैं और बार द्वारा विरासत में मिला है, इसलिए यह बार में भी संरक्षित है। लेकिन चूंकि यह मोटो एक्स पर एक त्रुटि दिखा रहा है, यह पूरी तरह अप्रत्याशित है। – varun