के विभिन्न संस्करणों में संकुल में संरक्षित आंतरिक वर्ग दृश्यता में मतभेद आज मैं अपने एंड्रॉइड कोडबेस में इस मुद्दे पर आया जिसने मुझे कुछ समय के लिए & मेरे सहकर्मियों को परेशान किया। हम पहले तो जैसे एक वर्ग संरचना था:एंड्रॉइड
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() {}
}
}
अजीब बात यह है कि पर परिवर्तन के बाद एंड्रॉयड के कुछ संस्करणों हम की तरह त्रुटियों मिलता है। मुझे नहीं लगता कि यह एक समस्या होगी क्योंकि Cog
protected
दृश्यता, Bar extends Foo
और InnerBar
InnerFoo
बढ़ाता है। आश्चर्यजनक रूप से, एंड्रॉइड के अन्य संस्करण ठीक काम करते हैं (कोई त्रुटि नहीं, कोई दृश्यता समस्या नहीं है)। हम Cog
को public
के रूप में घोषित करके इस मुद्दे को हल करने में सक्षम हैं, लेकिन यह एक अनावश्यक कामकाज की तरह लगता है।
हमने एंड्रॉइड 4.4.4 चलाने वाले मोटोरोला मोटो एक्स (पहली पीढ़ी डेवलपर संस्करण) पर समस्या देखी। हमें नेक्सस 5 चलने वाले लॉलीपॉप या एंड्रॉइड 4.1 पर चलने वाले नेक्सस एस पर समस्या नहीं थी 4.1.2
क्या कोई इस पर प्रकाश डाल सकता है?
क्या आप अभी भी त्रुटि प्राप्त करते हैं यदि आप एपीके को तैनात करने से पहले अपनी परियोजना को साफ करते हैं? –
निश्चित रूप से अभी भी एक साफ के बाद त्रुटि प्राप्त करें। मैंने एक सहयोगी को अपनी मशीन पर एक एपीके भी बनाया है, इसे बिना किसी समस्या के अपने फोन (नेक्सस 5/लॉलीपॉप) पर चलाएं, फिर एडीबी मोटो एक्स/केके पर एक ही एपीके इंस्टॉल करें और यह दुर्घटनाग्रस्त हो जाए। – loopyzort