{"id":1628,"date":"2012-12-23T13:03:58","date_gmt":"2012-12-23T11:03:58","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1628"},"modified":"2012-12-23T13:03:58","modified_gmt":"2012-12-23T11:03:58","slug":"klassenimplementierung-geht-vor-default-methoden","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/12\/klassenimplementierung-geht-vor-default-methoden\/","title":{"rendered":"Klassenimplementierung geht vor Default-Methoden"},"content":{"rendered":"<p>So wie zwar eine Sonnenfinsternis selten ist, aber vorkommt, so kann auch die seltene Konstellation eintreten, dass eine Klasse von zwei Seiten eine Implementierung bekommt. Erbt zum Beispiel eine Klasse A eine Implementierung f\u00fcr eine Methode f() und implementiert die Klasse A gleichzeitig eine erweiterte Schnittstelle I, von der sie eine Default-Methode f() vorgeschlagen bekommt, ist vom Compiler bzw. der Laufzeitumgebung eine Entscheidung gefragt. Zun\u00e4chst muss der Compiler entscheiden, ob so etwas \u00fcberhaupt syntaktisch korrekt ist. Die Antwort lautet: ja.<\/p>\n<p>Ein Beispiel soll denn Fall demonstrieren:<\/p>\n<p>interface Buyable {<\/p>\n<p>double price();<\/p>\n<p>default boolean hasPrice() { return price() &gt; 0; }<\/p>\n<p>}<\/p>\n<p>abstract class NotBuyable implements Buyable {<\/p>\n<p>@Override public boolean hasPrice() { return false; }<\/p>\n<p>}<\/p>\n<p>public class Love extends NotBuyable implements Buyable {<\/p>\n<p>@Override public double price() { return 10_01; }<\/p>\n<p>public static void main(String[] args) {<\/p>\n<p>System.out.println( new Love().hasPrice() ); \/\/ false<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>Wieder ist Buyable eine Schnittstelle mit einer Default-Methode hasPrice(). Neu ist eine abstrakte Klasse NotBuyable, die hasPrice() mit false beantwortet. Eine Klasse Love erweitert erstens NotBuyable und bekommt von dort hasPrice() und implementiert zweitens Buyable, was ebenfalls eine Implementierung \u00fcber die Default-Methode hasPrice() mitbringt. Nachdem wir festgestellt haben, dass dieses Szenario syntaktisch korrekt ist, muss die Laufzeitumgebung eine Entscheidung f\u00e4llen. Die sieht so aus, dass die Implementierung aus einer Klasse gewinnt. Ausgabe ist also false.<\/p>\n<p>Bleibt abschlie\u00dfend die Frage, wie sich der Compiler verh\u00e4lt, wenn einer Klasse aus zwei erweiterten Schnittstellen eine Default-Methode angeboten wird. Kurz und knapp: Das f\u00fchrt zu einem Compilerfehler. Die Klasse RockAndRoll zeigt dieses Dilemma:<\/p>\n<p>interface Buyable {<\/p>\n<p>boolean hasPrice();<\/p>\n<p>}<\/p>\n<p>interface Love extends Buyable {<\/p>\n<p>@Override default public boolean hasPrice() { return false; }<\/p>\n<p>}<\/p>\n<p>interface Guitar extends Buyable {<\/p>\n<p>@Override default public boolean hasPrice() { return false; }<\/p>\n<p>}<\/p>\n<p>public class RockAndRoll implements Love, Guitar { } \/\/ Compilerfehler<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So wie zwar eine Sonnenfinsternis selten ist, aber vorkommt, so kann auch die seltene Konstellation eintreten, dass eine Klasse von zwei Seiten eine Implementierung bekommt. Erbt zum Beispiel eine Klasse A eine Implementierung f\u00fcr eine Methode f() und implementiert die Klasse A gleichzeitig eine erweiterte Schnittstelle I, von der sie eine Default-Methode f() vorgeschlagen bekommt, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11,66],"tags":[],"class_list":["post-1628","post","type-post","status-publish","format-standard","hentry","category-insel","category-java-8"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1628"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1628\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}