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 Aet 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 Xcar il est masqué par un type hérité. Je ne peux pas utiliser le nom complet net.foo.X, car il netest masqué par un champ hérité.
Seule la classe Best dans ma base de code; les classes net.foo.Xet org.Asont 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 netavec ce préfixe global, mais Java ne le permet pas.
public void help(net.foo.X x) { x.doSomething(); }et appelez avechelp(null);