解決するのが非常に難しい名前の隠蔽に問題があります。問題を説明する簡略化されたバージョンを次に示します。
クラスがあります: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 ではそれができません。