Deux interfaces avec la même signature de méthode implémentée en classe Java
J'ai deux interfaces de Java et de mise en œuvre de la classe.
(J'ai utilisé Eclipse pour lancer directement le programme, et je n'ai pas essayer de vérifier tout d'avertissement du compilateur et cetera explicitement à la compilation en ligne de commande.)
Pourquoi font-ils fonctionner sans problème? Pourquoi Java permettre ce, même lorsqu'il satisfait le "contrat" de deux interfaces, mais créer une ambiguïté dans la mise en œuvre de la classe?
Mise à jour de l'exemple.
public interface CassettePlayer {
void play();
}
public interface DVDPlayer {
void play();
}
public class CarPlayer implements CassettePlayer,DVDPlayer{
@Override
public void play() {
System.out.println("This plays DVD, screw you Cassette !");
}
public static void main(String args[]) {
CarPlayer cp = new CarPlayer();
cp.play();
CassettePlayer firstInterface = new CarPlayer();
firstInterface.play();
DVDPlayer secondInterface = new CarPlayer();
secondInterface.play();
}
}
source d'informationauteur Rakesh Waghela
Vous devez vous connecter pour publier un commentaire.
Ce scénario est spécifiquement autorisé dans le Java Langage de Spécification, la section 8.1.5:
Ensuite, le texte continue de noter que, si les signatures de méthode a eu différents types de retour, comme
double
etint
il n'y aurait pas moyen d'implémenter deux interfaces dans la même classe et une erreur de compilation sera produit.Pour cette question, il est nécessaire de comprendre quelles sont les interfaces sont pour.
Une interface est une sorte de "contrat" pour que l'on connaît les méthodes qui sont obligatoirement mises en œuvre dans une Classe avec cette interface.
Donc, si vous avez besoin d'une Classe de mise en œuvre de "DVDPlayer" (parce que vous avez besoin de la "méthode play()"), vous trouverez CarPlayer. En va de même pour la nécessité d'une Classe implémentant CassettePlayer. C'est l'explication technique.
Mais bien sûr, dans votre sémantique de codage, vous devez vous assurer que CarPlayer de la "méthode play()" répond à la sémantique des deux DVDPlayer et CassettePlayer. Je pense que dans une application pratique, il sera une mauvaise pratique.
Bien sûr, dans votre exemple, c'est une mauvaise idée d'avoir deux interfaces de déclarer la même méthode. Plus concrètement, vous devriez en faire une interface "Joueur" avec "méthode play()" et deux autres, plus spécifiques, interfaces DVDPlayer et CassettePlayer (avec des méthodes spécifiques pour les Dvd et les cassettes) qui héritent de Joueur.
Sur le onther part, si vous n'avez pas besoin de méthodes spécifiques pour des Dvd ou des cassettes, alors vous n'avez pas besoin de deux interfaces différentes seulement la mise en œuvre de l'une et la même méthode, il suffit d'utiliser une interface Joueur, ce sera suffisant.
Il n'y a pas de conflit car ils sont tous deux spécifier le même contrat, la mise en œuvre de classes seulement de fournir une méthode qui est appelée lorsque référencé via l'interface.
Pourquoi pas? La classe est de satisfaire les contrats définis par les deux interfaces.
La classe implémente deux interfaces, donc pas de problème. Bien sûr, ce genre de chose devrait être évitée dans des scénarios plus complexes où un comportement non voulu qui pourraient en résulter.
La page suivante présente un exemple de classe
qui implémente deux interfaces qui ont le
1) même nom de variable
2) même méthode dans chaque interface.
http://www.j2eeonline.com/java-tm-fundamentals-II/module2/interface-ambiguous-fields.jsp
Dans cette situation, il n'y a pas de problème parce que les deux interfaces ont la même signature de la méthode. Mais Que penser de cela ?
Dont l'un est choisi par le compilateur ? Pourquoi fait-il erreur de code ci-dessous ?
Compilateur dit : Exception IOException n'est pas compatible avec les lancers de la clause dans les Plantes.manger()