Java名称隐藏:逐渐学习的方式
- 论坛
- Java名称隐藏:逐渐学习的方式
20 浏览
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.X
和org.A
是库类,所以我不能修改它们!
我唯一的解决办法是这样的:
我可以调用另一个类,然后这个类再调用X.doSomething()
;但这个类只存在于名称冲突的情况下,这看起来非常混乱!难道没有办法让我在B.doSomething()
中直接调用X.doSomething()
吗?
在一种允许指定全局命名空间的语言中,例如C#中的global::
或C++中的::
,我可以简单地在net
前加上这个全局前缀,但Java不允许这样做。