7.3

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

7.3
Hmm,

bin ja nich so der Java Checker deswegen folgendes. Normalerweise weist man ja einer Variable vom Typ des Interfaces eine Referenz auf so ne Instanz vonner Klasse, die das Interfaces implementiert. Hier wärs quasi BinaerbaumInterface b = new Binaerbaum(); Aber das bekomm ich wegen der generischen Klasse mal gar nicht compiliert. Ist hier also ein Binaerbaum a = new Binaerbaum(); auch i.O.?

Zum anderen steht im Interface auch immer eine variable vom Typ BinaerbaumInterface, was ich auch nich so ganz versteh, weil ja keine Instanz vonnem Interface gebildet werden kann. Also in meiner Klasse hab ich das Interface halt weggelassen. (Ist das generell so, dass man alles was im Interface mit angegeben ist in der eigenen Klasse mit ersetzt?

Und zu guter letzt. In der Angabe steht “…Konstruktor Binaerbaum(final Binaerbaum left, final Type value,
final Binaerbaum right)” fehlt das nicht das bei den beiden Variablen left und right? Najo, macht mich schlauer…

  • tobi

Wichtig ist, dass du keine Klasse Binaerbaum, sondern eine Klasse Binaerbaum schreibst.
Einen Binaerbaum erzeugst dann z.B. mit

BinaerbaumInterface b = new Binaerbaum<Irgendwas>();

oder

BinaerbaumInterface<Irgendwas> b = new Binaerbaum<Irgendwas>();

Wenn Foo Bar implementiert, dann ist eine Instanz von Foo gleichzeitig auch ein Bar und kann als Bar zurückgegeben werden.
Wenn du weißt, dass das Bar von einem Foo stammt, kannst du das Bar auch wieder nach Foo casten.

[quote]Und zu guter letzt. In der Angabe steht „…Konstruktor Binaerbaum(final Binaerbaum left, final Type value,
final Binaerbaum right)“ fehlt das nicht das bei den beiden Variablen left und right?[/quote]
Stimmt, das fehlt, aber in der Dokumentation in BinaerbaumInterface.java stehts da.


Ja, das hatte ich hier im post vergessen, im code stehts, aber dann gings trotzdem nicht, weil der compiler meckert, dass das ne unsichere operation is. er sagt er erwartet bei der zuweisung von b einen typ BinaerbaumInterface und halt nicht nur Binaerbaum, obwohl es implementiert ist. Geht das bei dir mit BinaerbaumInterface b = new Binaerbaum()?

  • tobi

Ja, nicht mal ein warning.


BinaerbaumInterface c = new Binaerbaum(a,6,b);

also so ne zeile hier z.b. funzt nicht, weil er schon beim new sagt er hatn Binaerbaum gefunden will aber n BinaerbaumInterface haben :frowning:


Hier mal ein Beispielbaum:

3 / \ 7 5 / \ \ 1 9 4 / 2
Java:

BinaerbaumInterface<Integer> eins = new Binaerbaum<Integer>(null, 1, null); BinaerbaumInterface<Integer> neun = new Binaerbaum<Integer>(null, 9, null); BinaerbaumInterface<Integer> zwei = new Binaerbaum<Integer>(null, 2, null); BinaerbaumInterface<Integer> vier = new Binaerbaum<Integer>(zwei, 4, null); BinaerbaumInterface<Integer> sieben = new Binaerbaum<Integer>(eins, 7, neun); BinaerbaumInterface<Integer> fuenf = new Binaerbaum<Integer>(null, 5, vier); BinaerbaumInterface<Integer> drei = new Binaerbaum<Integer>(sieben, 3, fuenf); drei.traverse(0);
Ausgabe:

Tiefe: 0, "3" Tiefe: 1, "7" Tiefe: 2, "1" Tiefe: 2, "9" Tiefe: 1, "5" Tiefe: 2, "4" Tiefe: 3, "2"


der code funzt bei mir auch, nur halt nicht wenn ich die variablen vom typ des interfaces mach, und ich versteh einfach nicht warum das nicht geht.


Komisch. Wenn du „(…)implements BinaerbaumInterface“ geschrieben hast, dann dürfte diese Fehlermeldung nicht kommen, weil ja dann jeder Binaerbaum auch gleichzeitig ein BinaerbaumInterface ist, und dann jede Methode, die ein BinaerbaumInterface will, auch ein Binaerbaum akzeptiert.


Ha,

na also… den Fehler hätt ich in 100Jahren nicht gefunden. Danke :wink:
Genau ganz da oben hab ichs vergessen… Da schaut man ja auch nie mehr hin :frowning:

  • tobi

Mit dem Beispiel von mrjazz kommt bei mir das gleiche raus.

Für nen anderen Traverse-Wert bekomm ich z.B.

Traverse(2):
Wert: 1 (Tiefe: 2)
Wert: 9 (Tiefe: 2)
Wert: 4 (Tiefe: 2)
Wert: 2 (Tiefe: 3)


Passt doch :slight_smile:

Aber trotzdem gut das du es erwähnst, bei mir verschiebt er einfach alles um 2 tiefen … muss ich nochmal ran :wink:


Hmm,

jo bei mir auch, aber andererseits frag ich mich, was die Ausgabe bei Noya fuer nen “Sinn” hat, weil das sind ja dann Werte von unterschiedlichen Binaerbaeumen quasi. Fuer ne Antwort von Hassandor waer ich mal wieder sehr dankbar :wink:

  • tobi

Steht nicht im Aufgabenblatt dass von aussen immer die Wurzel (0) angesprochen wird?


Jo so hab ich das auch verstanden, war mir aber wie so oft nicht 100% sicher, deswegen hat mich Noya nun ein bissl verunsichert Oo


"[…], die bei einem Aufruf mit tiefe = 0 an die Wurzel eines Binaerbaumes, jeden Knoten genau einmal durchläuft […]

Gut, das erfüllt mein Kode; aber sagt das aus, dass die anderen Fälle egal sind ?

Wie habt ihr das eigentlich in der traverse gelöst; bei mir werden neue instanzen mit rechts und links erzeugt, und dann mit denen traverse neu aufgerufen.


hm,

ich versteh ja java noch nicht so ganz, aber bestehen diese instanzen nicht eh schon? hab halt einfach left().traverse() genommen und zumindest inmeinem beispiel funktionierts Oo


Ahh, ok … geht auch ;D

Dankeschön. Keine Ahnung was ich mir gestern noch dabei gedacht habe.


Klar! Die Instanzen wurden doch in der main per new erzeugt. Und im Binaerbaum-Konstruktor hast du die Referenzen zu denen gespeichert.


Wenn man traverse mit einem höheren Wert aufruft, dann sollte genau das gleiche rauskommen, außer, dass alle Tiefenwerte mit dem höheren Wert aufaddiert angezeigt werden.
Eigentlich würde es mehr Sinn machen, wenn es eine Methode private traverse(int) und eine Methode public traverse(void) geben würde, wobei dann in der traverse(void)-Methode einfach nur traverse(0) aufgerufen wird.