public interface Foo {
}
public class SpecificFoo implements Foo {
}
public interface SomeInterface {
void thisMethod(Foo someKindOfFoo);
}
public class SomeClass implements SomeInterface {
public void thisMethod(Foo someKindOfFoo) {
// calling code goes into this function
System.out.println("Dont go here please");
}
public void thisMethod(SpecificFoo specificFoo) {
// not into this function
System.out.println("Go here please");
}
}
public class SomeOlderClass {
public SomeOlderClass(SomeInterface inInterface) {
SpecificFoo myFoo = new SpecificFoo();
inInterface.thisMethod(myFoo);
}
}
code appelant:Comment utiliser des interfaces Java avec plusieurs classes de mise en œuvre
SomeClass myClass = new SomeClass();
SomeOlderClass olderClass = new SomeOlderClass(myClass);
J'ai une interface (SomeInterface
) que plusieurs classes remettent en (comme SomeOlderClass
). J'ai une classe qui implémente l'interface, mais je veux faire des opérations sécurisées de type sur les implémentations spécifiques qui sont passées dans l'interface générique.
Comme indiqué dans le code ci-dessus, je veux vraiment pouvoir faire une autre méthode qui correspond au type spécifique transmis à l'interface. Cela ne fonctionne pas. Je suppose que c'est parce que le code appelant ne connaît que sur l'interface, et non la mise en œuvre des méthodes plus spécifiques (même si SpecificFoo implements Foo
)
Alors, comment puis-je faire cela de la manière la plus élégante? Je peux obtenir le code de travail en ajoutant une instruction if dans la classe qui implémente l'interface (SomeClass
):
public void thisMethod(Foo someKindOfFoo) {
// calling code goes into this function
if (someKindOfFoo.getClass().equals(SpecificFoo.class))
thisMethod(SpecificFoo.class.cast(someKindOfFoo));
else
System.out.println("Dont go here please");
}
Cependant, ce n'est pas élégant, que je dois ajouter, si des déclarations chaque fois que j'ajouter un nouveau type de Foo . Et je pourrais oublier de le faire.
L'autre option consiste à ajouter SpecificFoo
au SomeInterface
, et de laisser le compilateur trier rappelant que j'ai besoin d'implémentations dans SomeClass
. Le problème avec ceci est que je finis par ajouter un peu de code de plaque de chaudière. (Si quelqu'un d'autre implémente l'interface, ils doivent implémenter la nouvelle méthode, ainsi que tous les tests)
Il semble qu'il devrait y avoir une autre option qui me manque, étant donné que Foo
et SpecificFoo
sont liés. Des idées?
PLUS D'INFO:
Eh bien, je effectivement travaillé pendant un certain temps pour essayer de simplifier la question. Comme j'ajoute plus de détails, la complexité augmente un peu. Mais peu importe ... je pense que je peux l'expliquer.
Fondamentalement, je suis écrire un web GWT applications servlet RPC en utilisant le modèle de commande comme expliqué par Ray Ryan dans son talk
Il y a plusieurs implémentations de celui-ci sur google code, mais beaucoup d'entre eux souffrent de ce problème de Hériter. Je pensais que c'était un bug dans le code GWT-RPC bugreport Cependant, comme je l'implémentais plus loin, j'ai remarqué un problème similaire qui se passe purement sur le côté client, et en mode hébergé. (c'est-à-dire tous les java, pas de folie gwt javascript). J'ai donc abstrait les idées de base dans un cas de ligne de commande java brut, et j'ai vu le même problème, comme décrit ci-dessus.
Si vous suivez ce que Ray Ryan décrit, Foo
est une action, SpecificFoo
est une action spécifique que je veux appeler. SomeInterface
est le service RPC côté client et SomeClass
est la classe RPC côté serveur. SomeOlderClass
est un type de service rpc qui serait au courant de la mise en cache et autres joyeusetés.
Évident, non? Eh bien, comme je l'ai dit, je pense que toutes les absurdités du GWT RPC ne font que brouiller les cartes sur le problème de base, et c'est pourquoi j'ai essayé de le simplifier du mieux que je pouvais.
Pourquoi le sang sort-il de mes oreilles? – Jherico