2013-03-19 10 views
5

Ich habe eine Methode:Java Generics Warnungen auf java.util.Collections

public List<Stuff> sortStuff(List<Stuff> toSort) { 
    java.util.Collections.sort(toSort); 

    return toSort; 
} 

dies eine Warnung erzeugt:

Type safety: Unchecked invocation sort(List<Stuff>) of the generic method sort(List<T>) of type Collections. 

Eklipse sagt der einzige Weg, um die Warnung zu beheben, ist @SuppressWarnings("unchecked") hinzufügen meine sortStuff Methode. Das scheint eine miese Art zu sein, etwas mit Java zu tun.

Ist das wirklich meine einzige Option hier? Warum oder warum nicht? Danke im Voraus!

+11

Ihre 'void'-Methode gibt eine' List' zurück? – Reimeus

+2

Es ist so traurig, dass so viele Leute einen Fehler kommentieren, der offensichtlich dadurch verursacht wird, dass man die Frage an SO schreibt, anstatt die eigentliche Frage zu beantworten. – Sulthan

+0

Sicher, aber es könnte ein Hinweis darauf sein, dass dies tatsächlich nicht der echte Code ist, der ausgeführt wird und den Fehler erzeugt, also wäre es hilfreich, ihn aufzuräumen. – NilsH

Antwort

25

Collections.sort(List<T>) erwartet, dass TComparable<? super T> implementieren muss. Es scheint wie Stuff implementiert Comparable, aber bietet nicht das generische Argument Typ.

Stellen Sie sicher, dieses zu erklären:

public class Stuff implements Comparable<Stuff> 

Statt dessen:

public class Stuff implements Comparable 
+2

Nun, das wäre ein Fehler, oder? –

0

Sorting Generic Collections

Es gibt müssen den Rückgabetyp Ihrer Methode ändern zwei Sortierfunktionen, die in dieser Klasse definiert sind, siehe unten:

Keines davon ist für die Augen einfach und beide enthalten den Platzhalter (?) In ihren Definitionen. Die erste Version akzeptiert eine Liste nur, wenn T Comparable direkt oder eine generische Instanziierung von Comparable, die T oder eine Superklasse als generischen Parameter akzeptiert. Die zweite Version benötigt eine Liste und einen Komparator, die mit T oder einem Supertyp instanziiert sind.

3

Sie diese tou verwenden:

// Bad Code 
public class Stuff implements Comparable{ 

    @Override 
    public int compareTo(Object o) { 
     // TODO 
     return ... 
    } 

} 

oder das?

// GoodCode 
public class Stuff implements Comparable<Stuff>{ 

    @Override 
    public int compareTo(Stuff o) { 
     // TODO 
     return ... 
    } 

} 
+0

Gut, schnell zu sehen, wie man das generische vergleichbar umsetzt. –