86 votes

Les valeurs par défaut dans JDK 8 sont-elles une forme d'héritage multiple en Java?

Une nouvelle fonctionnalité à venir dans le JDK 8 vous permet d'ajouter à une interface existante, tout en préservant la compatibilité binaire.

La syntaxe est comme

public interface SomeInterface() {
  void existingInterface();
  void newInterface() default SomeClass.defaultImplementation;
}

De cette façon, pour toutes les implémentations existantes de l' SomeInterface lors de leur mise à niveau vers cette nouvelle version, ils ne sont pas tous tout d'un coup une compile des erreurs autour de newInterface().

Alors que c'est soigné, ce qui se passe quand vous êtes à la mise en œuvre de deux des interfaces qui ont ajouté une nouvelle méthode par défaut que vous n'avez pas le mettre en œuvre? Laissez-moi vous expliquer avec un exemple.

public interface Attendance {
   boolean present() default DefaultAttendance.present;
}

public interface Timeline {
   boolean present() default DefaultTimeline.present;
}

public class TimeTravelingStudent implements Attendance, Timeline {
}

// which code gets called?
new TimeTravelingStudent().present();

Cela a été défini dans le cadre du JDK 8?

J'ai trouvé la Java des dieux de parler de quelque chose de similaire ici http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.htmlmais sa partie de la liste de diffusion privée et je ne peux pas leur demander directement.

Voir ce pour plus de détails sur la façon dont les valeurs par défaut seront utilisées dans le JDK 8 et l'extension de l'interface de Collecte pour soutenir les lambdas: https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf

67voto

H-Man2 Points 1919

La réponse à la double opération:

Pour résoudre problème de l'héritage multiple une classe de mise en œuvre de deux interfaces de fournir une implémentation par défaut pour le même nom de méthode et de signature doit fournir une implémentation de la méthode. [Article Complet]

Ma réponse à votre question est: Oui, c'est une forme d'héritage multiple, parce que vous pouvez hériter de comportement des parents différents. Ce qui manque, c'est d'hériter unis, j'. e., les attributs.

9voto

Peter Lawrey Points 229686

La session vidéo à regarder se trouve ici http://medianetwork.oracle.com/video/player/1113272518001 C'est le concepteur qui parle de la fonctionnalité appelée Extensions virtuelles. Il explique également que cela ne rompt pas avec la compatibilité ascendante.

9voto

Enkk Points 61

Je sais que c'est un ancien post, mais comme je travaille avec ce genre de choses ...

Vous aurez une erreur du compilateur, vous disant que:

 La classe TimeTravelingStudent hérite de valeurs par défaut non liées pour present () à partir des types d'assistance et de référence de timeline à present est ambiguë.

4voto

Oliver Plow Points 545

Ma réponse à votre question est: Oui, c'est une forme d'héritage multiple, parce que vous pouvez hériter de comportement des parents différents. Ce qui manque, c'est d'hériter unis, j'. e., les attributs.

Oui, mais vous pouvez ajouter des accesseurs et mutateurs à votre interface de la mise en œuvre de classes doit ensuite mettre en œuvre. Néanmoins, la mise en œuvre de classes ne pas hériter des attributs. Donc, AFAICS, c'est plus comme un trait de style de la solution plutôt que l'héritage multiple style de solution.

1voto

Alexander Orlov Points 2135

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X