Mam problem z ukrywaniem nazwy, który jest niezwykle trudny do rozwiązania. Oto uproszczona wersja, która wyjaśnia problem:
Jest klasa: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
Potem jest klasa net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
A teraz mamy problematyczną klasę, która dziedziczy A
i chce zadzwonić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
}
}
Jak widzisz, nie jest to możliwe. Nie mogę użyć prostej nazwy, X
ponieważ jest ona ukryta przez dziedziczony typ. Nie mogę użyć w pełni kwalifikowanej nazwy net.foo.X
, ponieważ net
jest ona ukryta przez dziedziczone pole.
Tylko klasa B
jest w mojej bazie kodu; klasy net.foo.X
i org.A
są klasami bibliotecznymi, więc nie mogę ich zmieniać!
Moje jedyne rozwiązanie wygląda następująco: mógłbym wywołać inną klasę, która z kolei wywołuje X.doSomething()
; ale ta klasa istniałaby tylko z powodu konfliktu nazw, który wydaje się bardzo niechlujny! Czy istnieje żadne rozwiązanie, w którym można wywołać bezpośrednio X.doSomething()
z B.doSomething()
?
W języku, który umożliwia określenie globalnej przestrzeni nazw, np. global::
W C # lub ::
C ++, mógłbym po prostu poprzedzić net
ten globalny prefiks, ale Java na to nie pozwala.
public void help(net.foo.X x) { x.doSomething(); }
i zadzwoń zhelp(null);