मुझे नाम छिपाने की समस्या है जिसे हल करना बेहद कठिन है। यहाँ एक सरलीकृत संस्करण है जो समस्या की व्याख्या करता है:
एक वर्ग है: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
फिर एक वर्ग है net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
और अब, यहाँ समस्याग्रस्त वर्ग है जो विरासत में मिला है Aऔर कॉल करना चाहता हैnet.foo.X.doSomething()
package com.bar;
class B extends A {
public void doSomething(){
net.foo.X.doSomething(); // doesn't work; package net is hidden by inherited field
X.doSomething(); // doesn't work; type net.foo.X is hidden by inherited X
}
}
जैसा कि आप देख रहे हैं, यह संभव नहीं है। मैं सरल नाम का उपयोग नहीं कर सकता Xक्योंकि यह एक विरासत प्रकार द्वारा छिपा हुआ है। मैं पूरी तरह से योग्य नाम का उपयोग नहीं कर सकता net.foo.X, क्योंकि netएक विरासत क्षेत्र द्वारा छिपा हुआ है।
केवल कक्षा Bमेरे कोड आधार में है; कक्षाएं net.foo.Xऔर org.Aपुस्तकालय कक्षाएं हैं, इसलिए मैं उन्हें बदल नहीं सकता!
मेरा एकमात्र समाधान इस तरह दिखता है: मैं एक अन्य वर्ग को कॉल कर सकता था जो बदले में कॉल करता है X.doSomething(); लेकिन यह वर्ग केवल नाम के टकराव के कारण मौजूद होगा, जो बहुत ही गन्दा लगता है! वहाँ कोई समाधान नहीं है, जिसमें मैं सीधे कॉल कर सकते हैं है X.doSomething()से B.doSomething()?
वैश्विक नामस्थान निर्दिष्ट करने की अनुमति देने वाली भाषा में, उदाहरण के लिए, global::C # या ::C ++ में, मैं बस netइस वैश्विक उपसर्ग के साथ उपसर्ग कर सकता हूं , लेकिन जावा इसकी अनुमति नहीं देता है।
public void help(net.foo.X x) { x.doSomething(); }और के साथ फोनhelp(null);