Java名称隐藏:逐渐学习的方式

20 浏览
0 Comments

Java名称隐藏:逐渐学习的方式

我遇到了一个非常难以解决的名称隐藏问题。下面是一个简化版本来解释这个问题:

有一个类: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(); //无法工作;包net被继承的字段隐藏了
        X.doSomething(); //无法工作;类型net.foo.X被继承的X隐藏了
    }
}

如你所见,这是不可能的。我不能使用简单名称X,因为它被继承的类型隐藏了。我也不能使用全限定名net.foo.X,因为net被继承的字段隐藏了。

只有类B在我的代码库中;类net.foo.Xorg.A是库类,所以我不能修改它们!

我唯一的解决办法是这样的:

我可以调用另一个类,然后这个类再调用X.doSomething();但这个类只存在于名称冲突的情况下,这看起来非常混乱!难道没有办法让我在B.doSomething()中直接调用X.doSomething()吗?

在一种允许指定全局命名空间的语言中,例如C#中的global::或C++中的::,我可以简单地在net前加上这个全局前缀,但Java不允许这样做。

0