我有一个非常难以解决的名称隐藏问题。这是解释问题的简化版本:
有一个类: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 不允许这样做。