generische Methoden (Java)

Gast #1130347
1
    public static void sort(LinkedList<? extends Comparable> list)
2
    {
3
        LinkedList<? extends Comparable> sorted = new LinkedList();
4
        while(!list.isEmpty())
5
        {
6
            sorted.add(takeMin(list));
7
        }
8
        while(!sorted.isEmpty())
9
        {
10
            list.add(sorted.removeFirst());
11
        }
12
    }

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.
Persönliche Seite #1130491
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.
Gast #1130554
> Das neue Objekt sollte dann aber auch den passenden Typ bekommen und
> keine "ungetypte" Version.

Also:
1
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
1
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.
Persönliche Seite #1130603
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 ;)
1
public class listtest {
2
  public static void main(String[] args) {
3
    LinkedList<Comparable<? extends Object>> mylist = new LinkedList<Comparable<? extends Object>>();
4
    sort(mylist);
5
  }
6

7
  
8
  public static void sort(LinkedList<Comparable<? extends Object>> list)
9
    {
10
    LinkedList<Comparable<? extends Object>> sorted = new LinkedList<Comparable<? extends Object>>();
11
        while(!list.isEmpty())
12
        {
13
            sorted.add(takeMin(list));
14
        }
15
        list.addAll(sorted);
16
    }
17

18
  //Typprüfung hier nicht nötig, jede Klasse erbt automatisch von Object
19
  @SuppressWarnings("unchecked")
20
  private static Comparable<? extends Object> takeMin(LinkedList<? extends Comparable> list) {
21
    return Collections.min(list);
22
  }
23
}
Gast #1131041
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.