Grundlagen Variablendeklaration

Erdling1

Grünschnabel
Hallihallo!
Kann mir kurz jemand erklären was hier die Unterschiede sind:

Collection<String> stringlist1 = new ArrayList<String>();
List<String> stringlist2 = new ArrayList<String>();
ArrayList<String> stringlist3 = new ArrayList<String>();

Die Methode .getClass() liefert ja für alle 3 das gleiche Ergebnis (ArrayList).
Also was gilt es denn noch bei der Verwendung der Variablen zu beachten? Wo steckt der Sinn hinter einer Verallgemeinerung des Typs in der Deklaration, wenn er sowieso konkret festgelegt wird durch die Zuweisung?!

Man könnte es vielleicht auch an dem trivialen Beispiel erklären:
Object o1 = new Integer(3);
Integer o2 = new Integer(3);

Danke vorab

Erdling1
 
ArrayList ist die Klasse, List ist ein Interface von dem sie erbt, Collection ist ein Interface von dem List erbt.
Object ist die Klasse, von dem alle Klassen automatisch erben, Integer ist die Klasse des primitiven Datentyps int.

Wäre es nicht so wäre es doch nicht Objektorientiert.
 
Danke für die schnelle Antwort..aber das sind alles Informationen die ich auch habe ;-)

Was ich wissen möchte ist - gibt es einen Unterschied bei der Verwendung von stringlist1 und stringlist3 oder nicht?

Ich meine gelesen zu haben dass es einen gibt. Aber wenn nicht - wodrin liegt dann der Sinn in der unterschiedlichen Deklaration (wenn man eh weiss "was es wird")...?
 
Ja, dem selben wie wenn du z. B. Image statt BufferedImage verwendest. (Und auch wirklich ein Image reingeschrieben wird.)

Image hat die Methoden

clone()
equals(Object)
finalize()
getClass()
hashCode()
notify()
notifyAll()
toString()
wait()
wait(long)
wait(long, int)
or the notifyAll()
flush()
getGraphics()
getHeight(ImageObserver)
getProperty(String, ImageObserver)
getScaledInstance(int, int, int)
getSource()
getWidth(ImageObserver)

wärend BufferedImage als direkt davon erbent folgende Methoden hat:

clone()
equals(Object)
finalize()
getClass()
hashCode()
notify()
notifyAll()
toString()
wait()
wait(long)
wait(long, int)
or the notifyAll()
flush()
getGraphics()
getHeight(ImageObserver)
getProperty(String, ImageObserver)
getScaledInstance(int, int, int)
getSource()
getWidth(ImageObserver)
addTileObserver(TileObserver)
coerceData(boolean)
copyData(WritableRaster)
createGraphics()
flush()
getAlphaRaster()
getColorModel()
getData()
getData(Rectangle)
getGraphics()
getHeight()
getHeight(ImageObserver)
getMinTileX()
getMinTileY()
getMinX()
getMinY()
getNumXTiles()
getNumYTiles()
getProperty(String)
getProperty(String, ImageObserver)
getPropertyNames()
getRaster()
getRGB(int, int)
getRGB(int, int, int, int, int[], int, int)
getSampleModel()
getSource()
getSources()
getSubimage(int, int, int, int)
getTile(int, int)
getTileGridXOffset()
getTileGridYOffset()
getTileHeight()
getTileWidth()
getType()
getWidth()
getWidth(ImageObserver)
getWritableTile(int, int)
getWritableTileIndices()
hasTileWriters()
isAlphaPremultiplied()
isTileWritable(int, int)
releaseWritableTile(int, int)
removeTileObserver(TileObserver)
setData(Raster)
setRGB(int x, int y, int rgb)
setRGB(int, int, int, int, int[], int, int)
toString()

Offensitlich überschreibt BufferedImage auch ein paar Methoden wie toString, ist aber ich nerfend alles in Textarea-Form zu bringen. Nächstes mal denke ich mir was besseres aus.

Auf jeden Fall sieht man so, dass ArrayList die Methode trimToSize() besitzt, List aber nicht.

Mit

Java:
List l = new ArrayList();

kann man auf trimToSize(); nicht zugreifen, außer du castest es für diesen Vorgang zurück zu einer ArrayList:

Java:
List l = new ArrayList();
((ArrayList) l).trimToSize();

Außerdem ist das wichtig, falls du z. B. eine Methode hast, die eine beliebige Liste erwartest. So könntest du einfach sagen dass er auf eine List wartet, damit ist alles möglich was List implementiert. Ansonst müsstest du ein paar Funktionen mit den verschiedenen erwarteten Parametern (LinkedList, Vector usw.) schreiben.
 
danke :)

jetzt ist mir nur noch nicht klar, warum getClass() die gleiche Klasse liefert bei

List list1 = new ArrayList();
ArrayList list2 = new ArrayList();

obwohl ich ja nun bei list1 nur die Methoden einer List bekomme und nicht die einer ArrayList...
 
Weil du ja eine ArrayList und keine List reinschreibst. List ist ja nur ein Interface und kann garnicht intialisiert werden. Eine ArrayList zu einer List zu machen bringt meiner Meinung nach nichts, da eine ArrayList ja quasi auch selbst eine List ist.
Wie gesagt, die einzige Anwendung eines Interfaces wüsste ich jetzt auch, um sie einer Methode zu übergeben, wenn du ebenfalls das Übergeben von Vectoren und LinkedLists zulassen willst. In diesen Fall wäre dann die ArrayList automatisch eine List, und du hättest nur dessen Funktionen, außer du castest es wieder zurück in die eigendliche Klasse. Allerdings musst du dann erst herausfinden welcher Typ das Object ist, da dir sonst wohl beim casten eine Exception geschmissen wird.

Ist wohl so wie in der Mathematik, List ist dann wohl ein gemeinsamer Teiler der 3 Klassen.
 
Der Sinn dahinter List anstatt ArrayList zu verwenden ist die Abstraktion vom verwendeten Typ, was bei Collections fast immer getan wird.
Sprich die Initialisierung mit ArrayList erfolgt einmal, danach wird nur noch mit dem Typ List gearbeitet, der für alle Implementationen von List-Collections gleich zu benutzen ist.

Ob nun ein Vector, eine ArrayList oder eine LinkedList hinter dem Typ List liegt ist dann egal. Mittels List werden diese dann alle gleich verwendet. Der Entwickler der Klasse, die die Liste enthält ist in der Verantwortung einen passenden List-Typ auszuwählen. Spezialitäten der Implementation, die nur ein Vector hat wie z.B. die Methode insertElementAt(), werden durch Verwendung von List verdeckt, was oft erwünscht ist.

Schnittstellen, in denen die Liste enthalten ist, werden durch List statt ArrayList generischer.

Das Thema Collections ist top dokumentiert, ein Blick lohnt sich sicher:
http://java.sun.com/j2se/1.4.2/docs/guide/collections/index.html
 

Neue Beiträge

Zurück