Java 名称隐藏:艰难的方式
2022-08-31 10:39:00
我有一个名字隐藏的问题,很难解决。下面是一个简化版本来解释这个问题:
有一个类: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()
在允许指定全局命名空间的语言中,例如,在C#或C++中,我可以简单地以这个全局前缀为前缀,但Java不允许这样做。global::
::
net