У меня проблема со скрытием имени, которую очень сложно решить. Вот упрощенная версия, объясняющая проблему:
Есть класс: 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
этого глобального префикса, но Java этого не позволяет.
public void help(net.foo.X x) { x.doSomething(); }
и позвонить сhelp(null);