Übung 10 A 1.1 (Miniquiz)

Benutzeravatar
taufrisch
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 30. Sep 2007 02:42
Wohnort: 127.0.0.1

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von taufrisch » 19. Jan 2008 15:20

guido hat geschrieben:Genau; wie in der Vorlesung gesagt und auf den Folien zu lesen, kann man in eine Liste unbekannten Typs (?) nichts außer "null" speichern.
*Hust* Das hier die üblichen Verdächtigen Unsinn erzählen ist man ja gewöhnt, das jetzt schon der Dozent Verwirrung stiftet aber gar nicht gut.

Speichern kann man in einer Liste unbekannten Typs alles Mögliche, wie ja oben gezeigt. Also in List<? extends StockItem> zum Beispiel Shape und Rectangle, aber keinen String oder Object, wie ja in der Musterlösung auch richtigerweise steht. Was würde man auch mit Listen unbekannten Typs anfangen wollen, wenn man darin nichts speichern könnte?

Wir können in List<? extends StockItem> nichts einfügen wenn wir den Typ nicht kennen, wie auf T17 S. 27 bemerkt.

In den GdI 1-Folien habe ich aber nirgendwo einen Hinweis gefunden das "speichern" = "hinzufügen", und das würde auch die Musterlösung der Übung 10 A 1.1 falsch machen.

Wie gesagt, es stört mich wenig wenn hier einige meinen das "speichern" = "hinzufügen". Wenn der Dozent das meint stört mich das aber schon, da so eine Frage durchaus klausurrelevant sein kann.
Premature optimization is the root of all evil.

Don't anthropomorphize computers: They hate that.

Benutzeravatar
mantra
Computerversteher
Computerversteher
Beiträge: 385
Registriert: 23. Okt 2005 23:56
Wohnort: Wiesbaden

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von mantra » 19. Jan 2008 19:42

Was geht und was nicht geht, ist ja nun erschöpfend diskutiert worden - bleibt noch die Frage, ob "speichern" = "hinzufügen".

Man sollte dazu den Kontext betrachten, die Frage lautet dann "in einer Liste speichern" ?=? "in eine Liste hinzufügen".
Das Indefinitpronomen "eine" liegt hier im Dativ vor, die Präposition "in" ist somit lokal. Die Frage der Aufgabenstellung könnte also so umformuliert werden: "Welche Instanzen können sich in einer List <? extends Shape> befinden?". Damit ist die Musterlösung richtig.

Die Interpretation, dass "speichern" = "hinzufügen" ist, würde eine direktionale Präposition "in" verlangen. Das wäre bei der Formulierung "in eine Liste speichern" durch den Akkusativ "eine" gegeben. In diesem Fall würde "speichern" eine Richtung angeben und die Bedeutung "hinzufügen" nahelegen.

Wie nun im Beitrag von guido zu lesen ist, hat er von "in eine Liste speichern" geredet und somit keineswegs Unsinn geredet. Es bezog sich nur eben nicht auf die Aufgabenstellung, sondern auf die Unklarheiten im Forum, bzw auf den vorangegangenen Beitrag, welcher ebenfalls von "in eine Liste speichern" sprach.

Wenn hier also jemand meint, vorlaut den Dozenten der Verwirrungsstifung zu beschuldigen, sollte er selbst den Bezug verdeutlichen und eine klare Wortwahl verwenden. Übrigens ist List<? extends StockItem> keine Liste, sondern ein generischer Typ (vom Typ List).

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von Krümelmonster » 19. Jan 2008 20:33

So genau habe ich die Fragestellung nicht gelesen.

Damit entschuldige ich mich mal schnell für die Verwirrungen, die meine
falsche Interpretation verursacht hat. :oops:
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
taufrisch
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 30. Sep 2007 02:42
Wohnort: 127.0.0.1

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von taufrisch » 20. Jan 2008 03:58

mantra hat geschrieben:Die Interpretation, dass "speichern" = "hinzufügen" ist, würde eine direktionale Präposition "in" verlangen. Das wäre bei der Formulierung "in eine Liste speichern" durch den Akkusativ "eine" gegeben. In diesem Fall würde "speichern" eine Richtung angeben und die Bedeutung "hinzufügen" nahelegen.
Ist das klausurrelevant? :?
mantra hat geschrieben:Wie nun im Beitrag von guido zu lesen ist, hat er von "in eine Liste speichern" geredet und somit keineswegs Unsinn geredet. Es bezog sich nur eben nicht auf die Aufgabenstellung, sondern auf die Unklarheiten im Forum, bzw auf den vorangegangenen Beitrag, welcher ebenfalls von "in eine Liste speichern" sprach.
Ah so, ich kann also davon ausgehen das bei
gdi-u10-aufg.pdf hat geschrieben:Gegeben eine Klasse Shape mit Unterklassen Circle und Rectangle. Welche Instanzen kann man in einer List<? extends Shape> speichern?
die Musterlösug falsch ist, und man in dem generischen Typ (vom Typ List) nur null speichern kann? :shock:
mantra hat geschrieben:Wenn hier also jemand meint, vorlaut den Dozenten der Verwirrungsstifung zu beschuldigen, sollte er selbst den Bezug verdeutlichen und eine klare Wortwahl verwenden. Übrigens ist List<? extends StockItem> keine Liste, sondern ein generischer Typ (vom Typ List).
Iich bin ja immer bereit an der Weisheit Anderer teilzuhaben, und ich bin auch gerne bereit zuzugeben das ich mich geirrt habe, allerdings weiß ich im Moment nicht so genau in welchem Punkt. Irgendwie ist das Alles ziemlich verwirrend...
Premature optimization is the root of all evil.

Don't anthropomorphize computers: They hate that.

Benutzeravatar
guido
Computerversteher
Computerversteher
Beiträge: 378
Registriert: 30. Nov 2003 21:24
Wohnort: Mühltal
Kontaktdaten:

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von guido » 20. Jan 2008 09:55

Der lieben Klarheit willen (in der Hoffnung, nicht noch mehr zu verwirren!):
  • Vorab: eine Liste von unbekanntem Typ (?, ? extends X, ? super Y) kann man nicht instanziieren, da man nur konkrete Typen anlegen kann.
    Statt "LinkedList<? extends Shape> vector = new Vector<? extends Shape>();" muss man den dynamischen Typ etwa auf "= new LinkedList<Shape>();" festlegen. Die Diskussion um den "?"-Typ dreht sich also nur um den statischen Typ, etwa bei der Übergabe an Methoden.w
  • Eine Liste, die an einem Methode mit Parametertyp "<? extends Shape>" übergeben werden kann, ist immer eine konkrete Liste, also etwa eine "LinkedList<Shape>", "LinkedList<Circle>" oder "LinkedList<Rectangle>". Diese konkreten Listen, die gemäß Punkt 1 oben ja einen konkreten dynamischen Typ haben, können natürlich "passende" Elemente enthalten; die "LinkedList<Circle>" bzw. "LinkedList<Rectangle>" jeweils nur Circle- oder Rectangle-Instanzen sowie Untertypen (sofern es diese gibt); die "LinkedList<Shape>" alles, was sich von Shape ableiten lässt, inklusive Shape.
  • Zu einer Liste mit unbekanntem Typ -- auch wenn mit "extends" oder "super" begrenzt -- kann man aber keine Elemente hinzufügen, da der Typ jeweils potenziell nicht passt.
Beispiel:

Code: Alles auswählen

import java.util.LinkedList;

public class ListDemo {
	// Vorsicht: kann nicht mit LinkedList<Circle> etc. aufgerufen werden!
	public void addDemo2(LinkedList<Shape> shapes) {
		shapes.add(new Circle()); // fügt Circle hinzu
		shapes.add(new Rectangle()); // fügt Rectangle hinzu
	}
	// Vorsicht: kann zu Liste mit "?", "? extends X", "? super X" nichts hinzufügen!
/*	public void addDemo(LinkedList<? extends Shape> shapes) {
		shapes.add(new Circle());
		shapes.add(new Rectangle());
	}
*/
	public static void main(String[] args) {
	  ListDemo ld = new ListDemo();
	  // nicht OK: bei unbekanntem statischem Typ kein Hinzufügen möglich!  
//	  LinkedList<? extends Shape> shapes = new LinkedList<Shape>();
	  // konkreter statischer und dynamischer Typ: OK
	  LinkedList<Shape> shapes = new LinkedList<Shape>();
	  shapes.add(new Shape());
	  shapes.add(new Circle());
	  shapes.add(new Rectangle());
	  for (Shape s : shapes) {
		  System.out.println(s.toString());
	  }
//	  ld.addDemo(new LinkedList<Circle>());
	  ld.addDemo2(shapes);
	  for (Shape s : shapes) {
		  System.out.println(s.toString());
	  }
  }
}
Probiert es mal selbst aus; so wie es steht, kompiliert es fehlerfrei. Die kommentierten Zeilen sorgen aber für Ärger, wenn man sie wieder in den Code einfügt:
  • addDemo2(LinkedList<Shape>) kann man nicht mit einer LinkedList<Circle> aufrufen (Subtyp-Kovarianz), genausowenig wie mit einer LinkedList<Rectangle>. Siehe die Folien für eine ausführliche Erklärung; im Code sieht man aber auch, warum es nicht geht: in die Liste kann man sowohl Circle als auch Rectangle einfügen, und beides würde die Semantik der "Subtyp-Listen" zerstören.
  • in eine mit statischem Typ versehene LinkedList<? extends Shape> darf man gar nichts hinzufügen (auskommentierte Methode addDemo), da ja in eine LinkedList<Circle> etwa kein Rectangle eingefügt werden darf. Da wir dem Typprüfer nicht sagen, *was* wir kriegen und diese Info zur Laufzeit nicht mehr "da" ist (siehe Folien), kann Java nicht garantieren, dass eine beliebige Einfügeoperation "OK" ist.
  • Bei konkretem Typ können wir natürlich einfügen (LinkedList<Shape>, LinkedList<Circle>, LinkedList<Rectangle>), solange der eingefügte Typ zum Subtyp passt.
Guido

Benutzeravatar
mantra
Computerversteher
Computerversteher
Beiträge: 385
Registriert: 23. Okt 2005 23:56
Wohnort: Wiesbaden

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von mantra » 20. Jan 2008 11:20

taufrisch hat geschrieben:
mantra hat geschrieben:Die Interpretation, dass "speichern" = "hinzufügen" ist, würde eine direktionale Präposition "in" verlangen. Das wäre bei der Formulierung "in eine Liste speichern" durch den Akkusativ "eine" gegeben. In diesem Fall würde "speichern" eine Richtung angeben und die Bedeutung "hinzufügen" nahelegen.
Ist das klausurrelevant? :?
Nein, noch steht es nicht im Skript. Aber ich werde mich darum bemühen, dass es hinzugefügt wird :P
taufrisch hat geschrieben:Ah so, ich kann also davon ausgehen das bei
gdi-u10-aufg.pdf hat geschrieben:Gegeben eine Klasse Shape mit Unterklassen Circle und Rectangle. Welche Instanzen kann man in einer List<? extends Shape> speichern?
die Musterlösug falsch ist, und man in dem generischen Typ (vom Typ List) nur null speichern kann? :shock:
Nein, ich habe doch weiter oben argumentiert, weshalb die MuLö richtig ist. Hieße es "Welche Instanzen kann man in eine List<? extends Shape> speichern?, wäre die Musterlösung "falsch".
taufrisch hat geschrieben:Iich bin ja immer bereit an der Weisheit Anderer teilzuhaben, und ich bin auch gerne bereit zuzugeben das ich mich geirrt habe, allerdings weiß ich im Moment nicht so genau in welchem Punkt. Irgendwie ist das Alles ziemlich verwirrend...
Sorry. Du hast dich nicht geirrt, außer in dem Punkt, dass guido Unsinn reden würde. Denn es gibt nunmal offenbar verschiedene Wahrnehmungen der Bedeutung von "speichern" - und hier wurde alles vermischt.

Benutzeravatar
taufrisch
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 30. Sep 2007 02:42
Wohnort: 127.0.0.1

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von taufrisch » 20. Jan 2008 14:53

mantra hat geschrieben:Nein, ich habe doch weiter oben argumentiert, weshalb die MuLö richtig ist. Hieße es "Welche Instanzen kann man in eine List<? extends Shape> speichern?, wäre die Musterlösung "falsch".
Huärg, ich bitte doch in der Klausur keine Aufgaben mit "was kann man in eine List<?> speichern" gegen "was kann man in einer List<?> speichern" zu stellen. Ich sehe zwar den Unterschied, aber man hat ja nicht unbedingt die Zeit so genau zu lesen...
mantra hat geschrieben:Sorry. Du hast dich nicht geirrt, außer in dem Punkt, dass guido Unsinn reden würde.
Hab' ich nicht behauptet. Ich habe gesagt das die üblichen Verdächtigen Unsinn erzählen, was mir wenig ausmacht, und guido Verwirrung stiftet.

Letzteres kann ich durchaus begründen:
Der Thread fing an mit "Meiner Meinung nach ist keine der dargebotenen Ankreuzlösungen richtig". Ist eine legitime Frage - der Thread heißt ja auch "Übung 10 A 1.1" und nicht "allgemeine Diskussion über generischer Typen (vom Typ List)". Ich war der Erste der mal klar geschrieben hat, daß er die Musterlösung für richtig hält.

Allerdings wurde die Musterlösung (möglicherweise inkorrekt) als "in eine List<?> speichern" zitiert, wobei die Aufgabe "in einer List<?> speichern" heißt - da war ich wohl etwas lax. Dann kam Krümelmonster mit "Die Aussage, dass man in eine List<? extends Shape> keine Shapes und Rectangles speichern kann ist nach wie vor richtig".

Die Betonung lag hier auf "speichern" und nicht auf "in eine", es gab also durchaus Möglichkeit zum Zweifel an der Musterlösung. Guido hat das unterstützt, was meiner Ansicht nach zur Verwirrung beiträgt statt sie zu beseitigen. Wie gesagt, insbesondere bezogen auf das Thema (Musterlösung) und nicht auf fachliche Fragen zu Generics.

Normalerweise wäre mir das egal, aber wir können ja genau so eine Frage in der Klausur finden, und dann nützt mir das ganze Fachwissen nichts wenn ich der Frage keine korrekte Antwort zuordnen kann.
Premature optimization is the root of all evil.

Don't anthropomorphize computers: They hate that.

Benutzeravatar
Jo(h)nny
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 197
Registriert: 19. Dez 2007 23:39

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von Jo(h)nny » 20. Jan 2008 16:15

@guido,
Vorsicht: kann zu Liste mit "?", "? extends X", "? super X" nichts hinzufügen!
nun ich hab gerade ausprobiert und konnte in eine <? super x> alles was x oder extends x einfügen:)

Code: Alles auswählen

public void addDemo(LinkedList<? super StockItem> shapes) {
    shapes.add(new DVD(111,"blabla"));
    shapes.add(new DVD(111,"blabla"));
 }
hat bei mir ohne probleme funktioniert:), oder habe ich Sie falsch verstanden??
Atomenergie ist wie Sex - im Prinzip genial, wenn man nur wüsste wohin mit den Endprodukten.

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von Krümelmonster » 20. Jan 2008 17:00

Wie ich am Anfang des Threads geschrieben habe,
dürfte <? super X> wohl für alle Subklassen (einschließlich X) klar gehen.

Jedoch verwundert es mich jetzt doch, dass es funktioniert.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Benutzeravatar
taufrisch
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 30. Sep 2007 02:42
Wohnort: 127.0.0.1

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von taufrisch » 20. Jan 2008 19:58

Jo(h)nny hat geschrieben:nun ich hab gerade ausprobiert und konnte in eine <? super x> alles was x oder extends x einfügen
"<? super T>" ist praktisch das Inverse von "<? extends T>": Bei "List<? extends T>" kannst du Ts (oder Superklassen) herauslesen aber nur null hinzufügen, bei "List<? super T>" kannst du Ts (oder Subklassen) hinzufügen, aber nur Objects herauslesen.

Das ist logisch wenn man überlegt das bei "List<? extends T>" hinzugefügte Objekte zu allen potentiellen (auch unbekannten) Subklassen von T zuweisungskompatibel sein müssen, du dafür beim Lesen aber mindestens ein T hast.
In "List<? super T>" kannst du alles reinstecken was mindestens ein T ist, für gelesene Objekte gilt aber nur das sie zur "ungünstigsten" Superklasse von T (also Object) zuweisungskompatibel sind.
Premature optimization is the root of all evil.

Don't anthropomorphize computers: They hate that.

Benutzeravatar
Jo(h)nny
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 197
Registriert: 19. Dez 2007 23:39

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von Jo(h)nny » 20. Jan 2008 22:05

mir gings ja eigentlich nur um die aussage von unserem dozent:)
er hat in seinem code folgendes geschrieben:
Vorsicht: kann zu Liste mit "?", "? extends X", "? super X" nichts hinzufügen!
Atomenergie ist wie Sex - im Prinzip genial, wenn man nur wüsste wohin mit den Endprodukten.

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von Stumpf.Alex » 20. Jan 2008 23:05

Also..ich habe vorhin netterweise von einen Komilitonen einen netten Link zugesandt bekommen, der alle Verwirrung aus dem weggeräumt hat und ich hoffe, dass kann er bei euch auch. Wobei man bei der Quelle natürlich nie auf absolute Korrektheit plädieren sollte. Aber hier ein paar Auszüge:

Kovarianz ("extend"):
Man bezeichnet Arrays als kovariant, was besagt:
Aus T extends V folgt: T[] extends V[]

oder allgemeiner:
Aus T extends V folgt: GenerischerTyp<T> extends GenerischerTyp<V>

Es verhält sich also der Array-Typ bzgl. der Vererbungshierarchie genauso wie der Typparameter. Kovarianz ist auch mit generischen Typen möglich, allerdings nur mit Einschränkungen, so dass Typfehler zur Compilierzeit ausgeschlossen werden können.

Referenzen müssen mit der Syntax ? extends T explizit als kovariant gekennzeichnet werden. T heißt upper typebound, also der allgemeinste Typparameter, der erlaubt ist.

Code: Alles auswählen

ArrayList<? [b]extends [/b]Number> list;
list = [b]new [/b]ArrayList<Integer>();
list = [b]new [/b]ArrayList<Double>();
list = [b]new [/b]ArrayList<Long>();
list.set(index, myInteger);         // Fehler: nicht typsicher
Das Ablegen von Elementen in diesen Listen ist nicht möglich, da dies, wie oben beschrieben, nicht typsicher ist (Ausnahme: null kann abgelegt werden). Bereits zur Compilierzeit tritt ein Fehler auf. Allgemeiner gesagt, ist die Zuweisung
? -> ? extends T

nicht erlaubt.

Möglich dagegen ist das Auslesen von Elementen:

Code: Alles auswählen

Number x = list.get(index);   // OK
Integer x = list.get(index);  // Fehler: Es muss sich bei ? extends Number' nicht um ein Integer handeln.
Die Zuweisung
? extends T -> T (oder Basisklasse)

ist also erlaubt, nicht aber die Zuweisung
? extends T -> abgeleitet von T

Generics bieten also wie Arrays kovariantes Verhalten, verbieten aber alle Operationen, die typunsicher sind.


Kontrakovarianz ("super"):
Kontravarianz bezeichnet das Verhalten der Vererbungshierarchie des generischen Typs entgegen der Hierarchie seines Typparameters. Übertragen auf das obige Beispiel würde das bedeuten: Eine Liste<Number> wäre "abgeleitet" von (zuweisungskompatibel zu) einer Liste<Double>! Dies wird folgendermaßen bewerkstelligt:

Code: Alles auswählen

ArrayList<? super Double> list;
list = [b]new [/b]ArrayList<Number>();
list = [b]new [/b]ArrayList<Double>();
list = [b]new [/b]ArrayList<Object>();
Ein Objekt, das sich kontravariant verhält, darf keine Annahmen darüber machen, inwiefern ein Element vom Typ V von T abgeleitet ist, wobei T der lower Typebound ist (im Beispiel von '? super Double' ist T 'Double'). Deshalb kann aus den obigen Listen nicht gelesen werden:

Code: Alles auswählen

Number x = list.get(index);   // Fehler: 'list' könnte vom Typ List<Object> sein
Double x = list.get(index);   // Fehler: 'list' könnte List<Object> oder List<Number> sein
Object x = list.get(index);   // Die einzige Ausnahme: Objects sind auf jeden Fall in der Liste
Nicht erlaubt, da nicht typsicher, ist also die Zuweisung ? super T -> (abgeleitet von Object)

Unschwer zu erraten: Im Gegenzug kann in eine solche Liste ein Element abgelegt werden:

Code: Alles auswählen

ArrayList<? super Number> list;
list.add(myDouble);           // OK: 'list' hat immer den Typ List<Number> oder List<Basisklasse von Number>. Damit  ist die Zuweisung Double -> T immer erlaubt.

Für weitere aufklärende Details schaut euch die Quelle an.
Orignalquelle: http://de.wikipedia.org/wiki/Generische ... n_Java_5.0

fl4$h g0rd0n
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 115
Registriert: 1. Okt 2007 22:20

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von fl4$h g0rd0n » 20. Jan 2008 23:25

mantra hat geschrieben:Man sollte dazu den Kontext betrachten, die Frage lautet dann "in einer Liste speichern" ?=? "in eine Liste hinzufügen".
Das Indefinitpronomen "eine" liegt hier im Dativ vor, die Präposition "in" ist somit lokal. Die Frage der Aufgabenstellung könnte also so umformuliert werden: "Welche Instanzen können sich in einer List <? extends Shape> befinden?". Damit ist die Musterlösung richtig.
Ok danke, daran hat es gehapert. :)

@Stumpf.Alex
Das in der Vorlesung erwähnte Tutorial auf der Sun HP ist auch sehr empfehlenswert:
http://java.sun.com/docs/books/tutorial/extra/generics/

Es ist zwar auf Englisch, doch kann man sicher sein, dass die Inhalte korrekt sind.
"Education is the path from cocky ignorance to miserable uncertainty" -- Mark Twain

Benutzeravatar
guido
Computerversteher
Computerversteher
Beiträge: 378
Registriert: 30. Nov 2003 21:24
Wohnort: Mühltal
Kontaktdaten:

Re: Übung 10 A 1.1 (Miniquiz)

Beitrag von guido » 21. Jan 2008 09:23

Jo(h)nny hat geschrieben:mir gings ja eigentlich nur um die aussage von unserem dozent:)
er hat in seinem code folgendes geschrieben:
Vorsicht: kann zu Liste mit "?", "? extends X", "? super X" nichts hinzufügen!
Ja, das war falsch. Danke für den Hinweis; da habe ich mich selbst ausgetrickst.

Guido

Antworten

Zurück zu „Archiv“