mikrocontroller.net

Forum: PC-Programmierung generische Methoden (Java)


Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    public static void sort(LinkedList<? extends Comparable> list)
    {
        LinkedList<? extends Comparable> sorted = new LinkedList();
        while(!list.isEmpty())
        {
            sorted.add(takeMin(list));
        }
        while(!sorted.isEmpty())
        {
            list.add(sorted.removeFirst());
        }
    }

Die Mehtode soll alle Objekte entgegennehmen und sortieren, welche das 
Interface "Comparable" implementieren. Ist der Methodenrumpf so richtig?
Der Compiler meckert leider bei add(...) in Zeile 6 und 10. Die Methode 
"public static <T extends Comparable> T takeMin(LinkedList<T> list)" hat 
als Rückgabe ein Objekt, das ebenfalls "Comparable" implementiert. 
Genauso gibt "removeFirst()" ein "Comparable"-implementierendes Objekt 
zurück. Ich verstehe nicht, was der Compiler da zu Meckern hat.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das neue Objekt sollte dann aber auch den passenden Typ bekommen und 
keine "ungetypte" Version.
Und warum sträubst du dich weiterhin die bereits fertigen, 
funktionierenden und sehr viel effizienteren Funktionen der Collections 
API zu benutzen?

Ansosnten GENAUE Fehlerbeschreibungen helfen oft auch weiter.

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das neue Objekt sollte dann aber auch den passenden Typ bekommen und
> keine "ungetypte" Version.

Also:
LinkedList<? extends Comparable> sorted = new LinkedList()<? extends Comparable>;
?

Dann kommt die Fehlermeldung "illegal start of expression" oder "not a 
statement".

Ansonsten heißt die Fehlermeldung "cannot find method: 
add(Java.lang.Comparable)". Die Methode gibt es sehr wohl und die 
erwartet in diesem Fall auch ein Objekt, welches "Comparable" 
implementiert.

Der Rumpf der Methode takeMin lautet
public static <T extends Comparable> T takeMin(LinkedList<T> list)
Also gibt sie doch im Prinzip ein passendes Objekt an add(...) zurück.

> Und warum sträubst du dich weiterhin die bereits fertigen,
> funktionierenden und sehr viel effizienteren Funktionen der Collections
> API zu benutzen?

Mir geht es ja nicht darum, ein möglichst einfaches und effizientes 
Programm zu schreiben. Ich will lernen, wie man mit generische 
Datentypen umgeht.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maxim wrote:
> Mir geht es ja nicht darum, ein möglichst einfaches und effizientes
> Programm zu schreiben. Ich will lernen, wie man mit generische
> Datentypen umgeht.
Vieleicht nicht das beste Beispiel für den Einstieg da Compareable 
selbst schon generisch ist siehts zumindest häßlich aus ;)
public class listtest {
  public static void main(String[] args) {
    LinkedList<Comparable<? extends Object>> mylist = new LinkedList<Comparable<? extends Object>>();
    sort(mylist);
  }

  
  public static void sort(LinkedList<Comparable<? extends Object>> list)
    {
    LinkedList<Comparable<? extends Object>> sorted = new LinkedList<Comparable<? extends Object>>();
        while(!list.isEmpty())
        {
            sorted.add(takeMin(list));
        }
        list.addAll(sorted);
    }

  //Typprüfung hier nicht nötig, jede Klasse erbt automatisch von Object
  @SuppressWarnings("unchecked")
  private static Comparable<? extends Object> takeMin(LinkedList<? extends Comparable> list) {
    return Collections.min(list);
  }
}

Autor: Maxim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, vielen Dank für deine Hilfe!

Noch eine kleine Frage: Hat "Comparable<? extends Object>" eine andere 
Wirkung als wenn ich einfach nur "Comparable" schreiben würde?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein aber dann wird dir der Compiler die Berechtigte Warnung ausgeben 
das Comparable einen Typ Parameter erwartet.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.