Frage

Ich frage mich, ob es möglich ist, ein Nicht-Vergleichbares in etwas umzuwandeln, sodass es mit dem Methodenparameter T übereinstimmt, der den Vorlagentyp hat <T extends Comparable<? super T>>, wie Collections.sort() Methode

public static <T extends Comparable<? super T>> void sort(List<T> list)

Angenommen, ich habe irgendwo einen Verweis auf eine Liste nicht vergleichbarer Elemente und möchte diese Methode durch eine Umwandlung wie folgt aufrufen:

List<E> foo = new List<E>(a);
Collections.sort( /* magic cast */ foo);

Ich kann das tun, wenn ich dazu wirke (List<? extends Comparable>), aber dies generiert eine Warnung, dass ich Rohtypen verwende (in diesem Fall vergleichbar ohne Vorlagentypen).Nehmen wir an, ich möchte vermeiden, Rohtypen zu verwenden oder sie sogar zu unterdrücken @SuppressWarnings("rawtypes") (z.B.um die Abwärtskompatibilität zu wahren und Rohtypen zu vermeiden).

Ist es möglich, die Verwendung von Rohtypen durch Umwandeln zu vermeiden? (List<? extends Comparable</*something*/>>) und was wäre dieses „Etwas“ (ungeprüfte Besetzung ist akzeptabel)?

BEARBEITEN:Dieses Beispiel dient lediglich der Veranschaulichung.Eigentlich habe ich kein Comparable und möchte auch nichts sortieren, aber ich muss nur dynamisch prüfen, ob etwas von einem bestimmten Typ ist (in diesem Beispiel Comparable) (über Instanz von) und dann ein Argument an eine Methode übergeben, die Vorlagenargumente hat ähnlich wie Collections.sort() Methode.

War es hilfreich?

Lösung

Wirf es auf

Collections.sort((List<Comparable<Object>>) list);

Dadurch werden keine „Rohtyp“-Warnungen ausgegeben.Nur eine „ungeprüfte Besetzung“-Warnung (die Sie trotzdem erhalten werden).

Nach dem zu urteilen, was Sie in der erwähnt haben BEARBEITEN, letztendlich möchten Sie so etwas tun?

if(!list.isEmpty() && list.get(0) instanceof Comparable){
    List<Comparable<Object>> cmprList = (List<Comparable<Object>>)list;
    Collections.sort(cmprList);
}

Andere Tipps

Dies ist sicherlich nicht möglich. Collections.sort erfordert die Comparable um die anzurufen compareTo() Methode.Was sollte also Ihrer Meinung nach passieren, wenn sort eine Sammlung nicht vergleichbarer Objekte erhält?

Möglicherweise möchten Sie so etwas wie eine Standardreihenfolge verwenden, beispielsweise basierend auf den Referenzen.Aber so etwas existiert nicht implizit.Es ist jedoch umsetzbar.Aber ich bezweifle, dass Sie das wollen?Warum möchten Sie die Liste überhaupt sortieren?Und wie sollen diese Elemente sortiert werden?

Dies wird in Eclipse kompiliert:

List<?> foo = new ArrayList<Object>();
Collections.sort((List<Comparable>) foo);

Sie erhalten eine „Type Safety:„Unchecked“-Warnung, die Sie hiermit unterdrücken können:

@SuppressWarnings("unchecked")

Damit können Sie sort aufrufen.Ist es das, wonach Sie suchen?Natürlich gibt es keine Garantie dafür, dass es zur Laufzeit sicher ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top