У меня проблема с скрытием имени, которую очень сложно решить. Вот упрощенная версия, которая объясняет проблему:
Существует класс: 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::
в С# или ::
в С++, я мог бы просто префикс net
с этим глобальным префиксом, но Java этого не допускает.