La mise en œuvre de Génériques de l'Interface en Java
J'ai un Java génériques question j'espérais que quelqu'un pourrait répondre. Considérons le code suivant:
public interface Event{}
public class AddressChanged implements Event{}
public class AddressDiscarded implements Event{}
public interface Handles<T extends Event>{
public void handle(T event);
}
Je veux mettre en œuvre cette Poignées interface comme ceci:
public class AddressHandler implements Handles<AddressChanged>, Handles<AddressDiscarded>{
public void handle(AddressChanged e){}
public void handle(AddressDiscarded e){}
}
Mais java n'autorise pas la mise en œuvre de Poignées à deux reprises avec le Générique. J'ai été en mesure d'accomplir ceci avec C#, mais n'arrivent pas à trouver une solution de contournement en java sans l'aide de la Réflexion ou instanceof et le moulage.
Est-il un moyen en java pour mettre en œuvre les Poignées de l'interface en utilisant à la fois des interfaces génériques? Ou peut-être une autre façon d'écrire les Poignées de l'interface de sorte que le résultat final peut être accompli?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas le faire en Java. Vous ne pouvez mettre en œuvre une réalisation concrète de la même interface générique. Je voudrais faire ceci à la place:
Aller après @Amir Raminfar, vous pouvez utiliser visiteur modèle
Non, parce que les différents "en béton" types génériques en Java compiler le même type. L'interface réelle de votre objet sera mise en œuvre:
Et, évidemment, vous ne pouvez pas avoir deux différentes méthodes de même signature...
public void handle(Event event);
Autant que je sache, vous ne pouvez pas le faire, parce que lors de la compilation du code source en Java, ces deux bouillir jusqu'à
handle(Event)
, ce qui rend la méthode ambigu.Le générique de l'information n'est pas disponible lors de l'exécution de Java, contrairement à C#. C'est pourquoi il fonctionne comme vous le décrivez.
Vous aurez à changer les noms de méthode pour les rendre uniques, comme
handleAddressChanged
ethandleAddressDiscarded
.C'est en effet l'un des points faibles de Java génériques.
null
!) pour distinguer les méthodes.Malheureusement pas. La solution habituelle (gras, laid, rapide) est de créer un
Handles
de l'interface (c'est à direHandlesAddressChange
,HandlesAddressDiscarded
) et de donner à chacun d'eux une méthode différente (handleAddressChange(...)
,handleAddressDiscarded()
).De cette façon, le Java runtime peut les distinguer.
Ou vous pouvez utiliser des classes anonymes.
Il n'est pas autorisé parce que Java efface les signatures génériques lors de la compilation. La méthode de l'interface ont en fait la signature
Donc, vous avez deux choix. Soit mettre en œuvre des Gestionnaires distinct pour les différents événements:
ou de mettre en œuvre un traiteur pour tous, mais de vérifier le type de l'événement entrant:
Une mise en œuvre comme cela ne fonctionne pas en raison des contraintes de la spécification de java.
Mais si vous n'avez pas peur d'utiliser des AOP ou d'une sorte de CIO-Conteneur, vous pouvez utiliser les annotations pour que. Que vos Aspects ou le contenant pourrait gérer l'infrastructure de messagerie et d'appeler les méthodes que vous annoter.
Vous devez d'abord créer les annotations.
La vous pouvez annoter votre classe comme ça: