tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
247
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Erdling1 Erdling1 ist offline Grünschnabel
    Registriert seit
    Jan 2009
    Beiträge
    4
    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
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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.
     

  3. #3
    Erdling1 Erdling1 ist offline Grünschnabel
    Registriert seit
    Jan 2009
    Beiträge
    4
    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")...?
     

  4. #4
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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

    Code java:
    1
    
    List l = new ArrayList();

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

    Code java:
    1
    2
    
    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.
     

  5. #5
    Erdling1 Erdling1 ist offline Grünschnabel
    Registriert seit
    Jan 2009
    Beiträge
    4
    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...
     

  6. #6
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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.
     

  7. #7
    Avatar von Franz Degenhardt
    Franz Degenhardt Franz Degenhardt ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Ort
    Köln
    Beiträge
    378
    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/...ons/index.html
     
    Denken gefärdet die Gewohnheit

  8. #8
    Erdling1 Erdling1 ist offline Grünschnabel
    Registriert seit
    Jan 2009
    Beiträge
    4
    alles klar! super hilfe! danke
     

Ähnliche Themen

  1. VBA Excel - Variablendeklaration
    Von wal im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 06.11.08, 11:47
  2. Anfängerfragen zur Variablendeklaration
    Von simauki im Forum .NET Windows Forms
    Antworten: 9
    Letzter Beitrag: 18.09.08, 13:16
  3. php.ini Variablendeklaration erzwingen?
    Von wachteldonk im Forum PHP
    Antworten: 1
    Letzter Beitrag: 11.09.08, 18:14
  4. Variablendeklaration
    Von Alfred_ im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 24.04.04, 21:05
  5. Variablendeklaration in Klassen...
    Von Tim C. im Forum PHP
    Antworten: 5
    Letzter Beitrag: 11.09.03, 16:22