해결하기 매우 어려운 이름 숨김 문제가 있습니다. 다음은 문제를 설명하는 단순화 된 버전입니다.
수업이 있습니다. 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는이를 허용하지 않습니다.
public void help(net.foo.X x) { x.doSomething(); }
및 콜help(null);