Question

Je me demande si il est possible de jeter un non-Comparable à quelque chose de sorte qu'il correspond à la méthode de paramètre T qui a type de modèle <T extends Comparable<? super T>>, comme l' Collections.sort() méthode

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

Supposons que j'ai quelque part une référence à la liste des non-Comparables et souhaitez invoquer cette méthode de coulée comme ceci:

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

Je peux faire si je l'ai jeté à l' (List<? extends Comparable>), mais cela génère un avertissement que je suis à l'aide de matières-types (Comparable sans types de modèle (dans ce cas).Disons que je veux éviter à l'aide de matières-types ou même de les supprimer via @SuppressWarnings("rawtypes") (par ex.pour préserver la compatibilité ascendante et en évitant les raw-types).

Est-il possible d'éviter à l'aide de matières de type coulée de (List<? extends Comparable</*something*/>>) et qu'en serait-il que ce "quelque chose" (case non cochée cast est acceptable)?

MODIFIER:Cet exemple est juste pour illustrer ce point.En fait je n'ai pas Comparables, je ne veux trier quoi que ce soit, mais j'ai juste besoin de vérifier de façon dynamique si quelque chose est d'un certain type (Comparable dans cet exemple) (via instanceof), puis passer un argument à une méthode qui a des arguments de modèle similaire à la Collections.sort() la méthode.

Était-ce utile?

La solution

Il la jeta à

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

Ce ne sera pas de donner des "rawtype" mises en garde.Juste un "unchecked" jeté avertissement (que vous aurez de toute façon.)

À en juger par ce que vous avez mentionné dans la MODIFIER, en fin de compte, vous voulez faire quelque chose comme cela?

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

Autres conseils

Ce n'est certainement pas possible. Collections.sort nécessite l' Comparable pour appeler la compareTo() la méthode.Donc, dans votre oppinion, ce qui devrait se produire lorsque le tri est une collection de non-objets comparables?

Il pourrait être que vous voulez utiliser quelque chose comme un ordre par défaut, basé sur les références par exemple.Mais une telle chose n'existe pas, même implicitement.Cependant, il peut être mis en œuvre.Mais je doute que cela soit ce que vous voulez?Alors, pourquoi voulez-vous trier la liste en premier lieu?Et comment ces éléments seront triés?

Cela permettra de compiler dans Eclipse:

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

Vous obtiendrez un "Type de Sécurité:Unchecked" avertissement que vous pouvez supprimer avec ceci:

@SuppressWarnings("unchecked")

Qui vous permettra d'appel de tri.Est-ce que vous cherchez?Aucune garantie qu'il sera en sécurité au moment de l'exécution, bien sûr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top