Übung 10 A 1.1 (Miniquiz)

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

Übung 10 A 1.1 (Miniquiz)

Beitrag von fl4$h g0rd0n » 17. Jan 2008 12:45

Hallo,

laut Musterlösung meines Tutors kann man in eine List<? extends Shape> sowohl ein Rectangle als auch Shape speichern.

Meiner Meinung nach ist keine der dargebotenen Ankreuzlösungen richtig. Man kann aus einer List<? extends Shape> Elemente lesen, aber keine speichern, da die add Methoden nur null als Wert akzeptieren. Ansonsten könnte man über diese List<? extends Shape> Referenz ein Shape oder Rectangle bspw. in eine ArrayList<Circle> speichern.

Was ist richtig?
"Education is the path from cocky ignorance to miserable uncertainty" -- Mark Twain

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 » 17. Jan 2008 13:05

Richtig ist, dass nicht alles gleichzeitig geht.

Aber wenn eine Funktion den Parameter List<? extends Shape> erwartet, kann der übergebene Parameter zum Beispiel von diesen Typen sein:
  • List<Shape>
  • List<Rectangle>
(aber nicht vom Typ List<Object>)

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 » 17. Jan 2008 15:35

aber keine speichern, da die add Methoden nur null als Wert akzeptieren
hast recht, hab gerade ausprobiert

Code: Alles auswählen

DVD item1 = new DVD(111, "DVD");

List<? super StockItem> list = new ArrayList<StockItem>();

list.add(0, item1);
also mit List<? extends StockItem> kann man in die liste nur null adden, wie du gesagt hast, ka wieso :?:
da hat glaub ich jemand (wieder ma :wink: ) nicht aufgepasst, bei der erstellung der aufgabe:)
Atomenergie ist wie Sex - im Prinzip genial, wenn man nur wüsste wohin mit den Endprodukten.

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 » 17. Jan 2008 15:52

wobei das ja eigentlich total unlogisch ist..... wenn man sagt, dass list eine new ArrayListe die StockItems enthält, müsste man doch in die liste StockItems einfügen können :?: :?: :?:
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 » 17. Jan 2008 16:01

Ersetze das super mal mit extends.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

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 » 17. Jan 2008 16:04

Jo(h)nny hat geschrieben:wobei das ja eigentlich total unlogisch ist..... wenn man sagt, dass list eine new ArrayListe die StockItems enthält, müsste man doch in die liste StockItems einfügen können :?: :?: :?:
Das mag zwar in diesem Fall laut Intuition zu korrektem Verhalten führen, aber eben nicht in allen. Hier schlägt das Typsystem/Compiler wieder zu: Konstrukte, die zu einem Fehler führen könnten, werden nicht akzeptiert.
"Education is the path from cocky ignorance to miserable uncertainty" -- Mark Twain

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 » 17. Jan 2008 16:12

Ersetze das super mal mit extends.
ich hab doch gesagt, dass man mit extends nur null einfügen kann. kannst ma ausprobieren, wenn du mir nicht glaubst :mrgreen:
@flashgordon, so habs gecheckt, der statische typ ist unbekannt, aber erbe von StockItem, deswegen können wir da nichts einfügen, weil er ja nicht weiss welches erbe von StockItem wir nehmen..... und bei super gehts, weil StockItem auf jeden fall kompatibel bleibt. alles klar :mrgreen:
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 » 17. Jan 2008 16:18

Der Grund ist der, dass eben List<StockItem> kein Subtyp von
List<DVD> ist, denn wenn es so wäre, dann könnte man eben
unterschiedliche Typen in der Liste speichern, was der Idee
der Generics eben nur einen bestimmten Typ speichern zu könnnen
widerspricht.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

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 » 17. Jan 2008 16:26

@krümelmonster, ich verstehe nicht ganz, was du mir damit sagen möchtest, der punkt ist der, wenn du
List<? super StockItem> list = new ArrayList<StockItem>();
eingibst, du anschlissend list.add(blab,bla); machen kannst, was aber bei
List<? extends StockItem> list = new ArrayList<StockItem>();
nicht der fall ist. hier kannst du lediglich list.add(0, null); machen.
das hat jetzt mit DVD - typ nichts zu tun
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 » 17. Jan 2008 16:50

Naja List<? super StockItem> sagt aus, das mindestens
ein StockItem gespeichert werden darf.
ArrayList<StockItem> erfüllt mit Sicherheit diese Bedingung.
Und eine DVD ist mindestens ein StockItem, also passt es auch.

Hingegen bei List<? extends StockItem> ist zwar die Bedingung
ArrayList<StockItem> erfüllt, aber wie soll der Typprüfer wissen,
welche Arten von StockItems hinein dürfen? Da er konservativ ist,
schließt er alle Möglichkeiten aus.

Die Idee bei Generics ist ja, alle Typen zusammenzufassen, auf denen
die gleichen Operationen möglich sind.

Bei <? super StockItem> ist das kein Problem, da auf Elementen in dieser
Collection nur Operationen anwendbar sind, die StockItem besitzt.

Wie soll aber bei <? extends StockItem> entschieden werden, welche Operationen
verfügbar sind. Möglicherweiße besitzt ja die Klasse Book eine Methode, die die Anzahl
der Seiten zurückgibt, was bei AudioCDs wohl keinen Sinn macht.

Einigen Programmierern mag dieses konservative Verhalten lästig erscheinen.
(Ich gehöre dazu ;) )
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

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 » 17. Jan 2008 17:09

jop, also haben wir gerade beschlossen, dass die aufgabenstellung falsch ist:)
Atomenergie ist wie Sex - im Prinzip genial, wenn man nur wüsste wohin mit den Endprodukten.

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 » 17. Jan 2008 23:22

fl4$h g0rd0n hat geschrieben:laut Musterlösung meines Tutors kann man in eine List<? extends Shape> sowohl ein Rectangle als auch Shape speichern.
Richtig.
mantra hat geschrieben:Richtig ist, dass nicht alles gleichzeitig geht.
Falsch:

Code: Alles auswählen

List<Shape> ls = new ArrayList<Shape>();
ls.add(new Shape());
ls.add(new Rectangle());
List<? extends Shape> les = ls;
Et voilà, in les sind sowohl ein Rectangle als auch ein Shape.
Jo(h)nny hat geschrieben:wobei das ja eigentlich total unlogisch ist..... wenn man sagt, dass list eine new ArrayListe die StockItems enthält, müsste man doch in die liste StockItems einfügen können
Nö:

Code: Alles auswählen

List<Book> lb = new ArrayList<Book>();
List<? extends StockItem> les = lb;
StockItem si = new DVD();
// les.add(si); <-- geht nicht
for (Book b : lb)
    b.getNumberOfPages();
Sonst hättest du eine DVD in einer Bücherliste.
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 » 17. Jan 2008 23:42

Code: Alles auswählen

List<Shape> ls = new ArrayList<Shape>();
ls.add(new Shape());
ls.add(new Rectangle());
List<? extends Shape> les = ls;
also so rum gehts wirklich :roll: , nehme alles zurück:)
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 » 18. Jan 2008 00:11

Die Aussage, dass man in eine List<? extends Shape> keine Shapes und Rectangles speichern kann
ist nach wie vor richtig.

In les lässt sich aus genannten Gründen nur null speichern.
Aber lesen lassen sich sowohl Shapes als auch Rectangles, da
List<Rectangle> eben ein Subtyp von List<? extends Shape> ist.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

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 » 19. Jan 2008 12:12

Krümelmonster hat geschrieben:Die Aussage, dass man in eine List<? extends Shape> keine Shapes und Rectangles speichern kann
ist nach wie vor richtig.

In les lässt sich aus genannten Gründen nur null speichern.
Aber lesen lassen sich sowohl Shapes als auch Rectangles, da
List<Rectangle> eben ein Subtyp von List<? extends Shape> ist.
Genau; wie in der Vorlesung gesagt und auf den Folien zu lesen, kann man in eine Liste unbekannten Typs (?) nichts außer "null" speichern. In eine List<Shape> kann man Objekte vom Typ "Shape" oder allen Untertypen speichern; in eine List<DVD> hingegen nur DVDs, aber keine StockItems. Und List<Circle> passt nicht zu List<Shape>, aus den in der Vorlesung ausführlich auf den Folien und verbal dargestellten Gründen.

Sind damit alle Fragen beantwortet? :)

Guido

Antworten

Zurück zu „Archiv“