Ad gizlemeyle ilgili çözmesi son derece zor bir sorunum var. Sorunu açıklayan basitleştirilmiş bir versiyon:
Bir sınıf var: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
Sonra bir sınıf var net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
Ve şimdi, buradan miras alan A
ve aramak isteyen sorunlu sınıf.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
}
}
Gördüğünüz gibi bu mümkün değil. X
Kalıtsal bir tür tarafından gizlendiği için basit adı kullanamıyorum . Tam adı kullanamıyorum net.foo.X
çünkü net
devralınan bir alan tarafından gizlenmiş durumda.
B
Kod tabanımda yalnızca sınıf var; sınıflar net.foo.X
ve org.A
kütüphane sınıfları, bu yüzden onları değiştiremem!
Tek çözümüm şuna benziyor: Sırayla arayan başka bir sınıfı arayabilirim X.doSomething()
; ancak bu sınıf, çok dağınık görünen isim çatışması nedeniyle var olabilirdi! Ben doğrudan çağrı hangi çözüm var mı X.doSomething()
gelen B.doSomething()
?
Global isim alanının belirlenmesine izin veren bir dilde, örneğin global::
C # veya ::
C ++ 'da, basitçe net
bu genel önekle önek alabilirim, ancak Java buna izin vermiyor.
public void help(net.foo.X x) { x.doSomething(); }
ve ile arayınhelp(null);