Vous ne pouvez pas faites-le directement dans une classe car la définition de classe ci-dessous ne peut pas être compilée en raison de l'effacement des types génériques et de la déclaration de l'interface en double.
class TwoTypesConsumer implements Consumer<Apple>, Consumer<Tomato> {
// cannot compile
...
}
Toute autre solution pour emballer la même consommer des opérations dans une classe nécessite de définir votre classe:
class TwoTypesConsumer { ... }
qui est inutile que vous devez répéter/dupliquer la définition des deux opérations et ils ne sera pas référencé depuis l'interface. À mon humble avis, c'est une mauvaise duplication de code que j'essaie d'éviter.
Cela peut être aussi un indicateur qu'il y a trop de responsabilités dans une classe pour consommer 2 objets différents (s'ils ne sont pas couplés).
Cependant ce que je fais et ce que vous pouvez faire est d'ajouter explicitement objet usine pour créer les consommateurs connectés de la manière suivante:
interface ConsumerFactory {
Consumer<Apple> createAppleConsumer();
Consumer<Tomato> createTomatoConsumer();
}
Si, en réalité, ces types sont vraiment couplés (liés) alors je conseillerions à créer une mise en œuvre de telle manière:
class TwoTypesConsumerFactory {
// shared objects goes here
private class TomatoConsumer implements Consumer<Tomato> {
public void consume(Tomato tomato) {
// you can access shared objects here
}
}
private class AppleConsumer implements Consumer<Apple> {
public void consume(Apple apple) {
// you can access shared objects here
}
}
// It is really important to return generic Consumer<Apple> here
// instead of AppleConsumer. The classes should be rather private.
public Consumer<Apple> createAppleConsumer() {
return new AppleConsumer();
}
// ...and the same here
public Consumer<Tomato> createTomatoConsumer() {
return new TomatoConsumer();
}
}
l'avantage est que la classe usine connaît les deux implémentations, il y a un état partagé (si nécessaire) et vous pouvez retourner les consommateurs plus accouplées si nécessaire. Il n'y a pas de déclaration de méthode de consommation répétitive qui ne soit dérivée de l'interface.
Veuillez noter que chaque consommateur peut être indépendant (encore privé) s'il n'est pas complètement lié.
L'inconvénient de cette solution est une complexité de classe supérieure (même si cela peut être un fichier java) et d'accéder à consommer la méthode que vous besoin d'un plus appel donc au lieu de:
twoTypesConsumer.consume(apple)
twoTypesConsumer.consume(tomato)
vous:
twoTypesConsumerFactory.createAppleConsumer().consume(apple);
twoTypesConsumerFactory.createTomatoConsumer().consume(tomato);
pour résumer, vous pouvez définir 2 consommateurs génériques dans une classe de niveau supérieur avec 2 classes internes mais en cas de besoin vous appeler pour obtenir d'abord une référence à la mise en œuvre appropriées consommateur car cela ne peut pas être simplement un objet de consommation.
Pourquoi avez-vous besoin de deux interfaces génériques du même type de base? – akarnokd
En raison de l'effacement de type, vous ne pouvez pas faire cela. Gardez deux classes différentes qui implémente le consommateur. Fait plus de petites classes mais conserve votre code générique (N'utilisez pas la réponse acceptée, cela casse tout le concept ... vous ne pouvez pas traiter TwoTypesConsumer en tant que consommateur, ce qui est BAD). –