Forum: PC-Programmierung generische Methoden (Java)


von Maxim (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


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.

von Maxim (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


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
}

von Maxim (Gast)


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?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.