我有一个很难解决的名称隐藏问题。这是解释问题的简化版本:
有一个类: 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不允许这样做。
net.foo.X
有方法,没有org.A.X
!
A
吗?正如您所发现的那样,继承是如此令人讨厌……
I could call another class that in turn calls X.doSomething(); but this class would only exist because of the name clash, which seems very messy
+1为简洁代码的态度。但对我来说,似乎是这种情况,您应该进行权衡。只需执行此操作,然后就为什么必须这样做(可能带有指向该问题的链接)就该原因提出了很长的评论。
public void help(net.foo.X x) { x.doSomething(); }
并致电给help(null);