我有个名字隐藏的问题,非常难解决。这里有一个简化版本来解释这个问题:
有一个类: 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(); 但是这个类只会因为名称冲突而存在,这看起来非常混乱!有没有可以直接从 B.doSomething()调用 X.doSomething()的解决方案?
在允许指定全局名称空间的语言中,例如 C # 中的 global::或 C + + 中的 ::,我可以简单地用这个全局前缀给 net加上前缀,但 Java 不允许这样做。