Merkwürdige Java OCA Prüfungsfrage zu Interfaces

java8

#1

Hallo Welt!

Ich arbeite nun schon ein Jahr fast ausschließlich mit Java und habe mich dazu verleiten lassen, die Oracle Java Programmer 1 OCA Prüfung zu machen. Ich habe bei der Vorbereitung definitv schon ein paar nützliche Dinge gelernt, möchte aber nicht darüber diskutieren, wie sinnvoll die Prüfung ist. Ich bereite mich mit Hilfe eines Buchs von McGrawHill vor und es ist auch eine Übungsprogramm mit 2 Probeexams enthalten. Auf der Suche nach einem deutschsprachigen Forum habe ich den Heise Artikel aus 2013 gefunden und bin dann hier gelandet, wo ich mit Profis über die rätselhafte Übungsfrage diskutieren möchte. Falls ich irgend etwas übersehen habe, bitte einfach gerade heraus damit.

TL;DR;
Bei einem Übungstest bin ich über folgende Frage gestoßen:
Bin ich blöd, oder stimmt da etwas an der Frage (/Auflösung) nicht?

Frage, Antwortmöglichkeiten, Auflösung:

PS: mir geht es nicht um Antwortmöglichkeit E, das habe ich begriffen. Was mich stört ist Antwortmöglichkeit G. In was für einem Universum kann man .super auf ein Interface anwenden?


#2

Interessant, das hatte ich gar nicht so auf dem Schirm. Ich hatte mir damals zwar https://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf angeschaut, wo auf solche Fragen eingegangen wird, aber konkret hatte ich den Fall IIRC noch nicht. Beschrieben ist das Problem dort unter 3.7, aber es gibt sicher bessere (neuere) Stellen, an denen man das nachlesen kann.

Das eigentliche Problem tritt bei sowas auf:

interface A 
{
    default String name() 
    { 
        return "A";
    }
}

interface B 
{
    default String name() 
    { 
        return "B";
    }
}

interface C extends A, B
{

}

Eclipse meckert nun über das interface C, mit der Meldung

Duplicate default methods named name with the parameters () and () are inherited from the types B and A

Und um sowas auflösen zu können, kann man explizit die Methode aus einem bestimmten Interface aufrufen:

@Override
default String name()
{
    return A.super.name();
}

In dem Beispiel vom OCA ist das ein bißchen versteckt und verschleiert, IMHO, aber … das hat wohl System…


#3

Nice. Danke, werde ich gleich ausprobieren.

edit: Nice!!! :smile:
Danke Marco13, du bist der Beste! Hätte das beinahe als Fehler in der Frage abgetan. Danke für den Hinweis.
edit2: wenn du mal in Wien bist, geb ich ein Bier aus.