generische Methoden (Java)

Gast #1130347
Lesenswert?

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.
Gast #1130554
Lesenswert?

> 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
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 ;)
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren