J'ai un problème de masquage de nom qui est extrêmement difficile à résoudre. Voici une version simplifiée qui explique le problème:
Il y a une classe: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
Puis il y a une classe net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
Et maintenant, voici la classe problématique qui hérite A
et veut appelernet.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
}
}
Comme vous le voyez, ce n'est pas possible. Je ne peux pas utiliser le nom simple X
car il est masqué par un type hérité. Je ne peux pas utiliser le nom complet net.foo.X
, car il net
est masqué par un champ hérité.
Seule la classe B
est dans ma base de code; les classes net.foo.X
et org.A
sont des classes de bibliothèque, donc je ne peux pas les modifier!
Ma seule solution ressemble à ceci: je pourrais appeler une autre classe qui à son tour appelle X.doSomething()
; mais cette classe n'existerait qu'à cause du nom clash, qui semble très désordonné! Yat - il pas de solution dans laquelle je peux appeler directement à X.doSomething()
partir B.doSomething()
?
Dans un langage qui permet de spécifier l'espace de noms global, par exemple, global::
en C # ou ::
en C ++, je pourrais simplement préfixer net
avec ce préfixe global, mais Java ne le permet pas.
public void help(net.foo.X x) { x.doSomething(); }
et appelez avechelp(null);