9
votes

Comment trier une liste de types génériques en Java

J'ai un ensemble de classes qui partagent tous des attributs courants, donc je les ai donc fabriqués à une classe de base commune, baseentité (code>. Donc j'ai, par exemple, foo prolonge la base et et la barre étend la baseentité .

i Voulez aussi des listes de ces FOO et bar Objets à être triables, donc j'ai mis en œuvre comparable . J'ai les classes définies comme FOO étend la baseentité implémente des implements comparables et et Barre de base implémente des implements comparables et le tri des listes de foo s ou bar S fonctionne comme prévu - et, bien sûr, les détails du tri sont différents dans les différentes sous-classes. Mais je ne peux pas comprendre comment faire mon travail de tri lorsque je ne sais pas à l'avance, si j'aurai FOO S ou bar s. Ce code, par exemple, ne parvient pas à compiler: xxx

avec le message d'erreur MisMatch lié: La méthode générique Trier (liste ) des collections de type n'est pas applicable aux arguments (liste ). Le type T inféré n'est pas un substitut valide pour le paramètre délimité >

Je pense que je pense que je tente de trier une liste des objets Basenentialité d'objets et base de la base ne pas 't Implémenter comparable . Mais maintenant, je suis confronté à un problème: la seule chose sensible à fabriquer des objets comparables aux objets Basenentialité , mais lorsque j'ajoute implémente comparable to base et code>, le compilateur me dit que j'ai des problèmes maintenant parce que mon FOO tente de mettre en œuvre les deux comparable et comparable , qui n'est évidemment pas autorisé.

Je sais que je pouvais éviter ce problème en supprimant le implémente comparable et juste Mise en œuvre comparable , mais alors mon comparèteo doit faire la coulée laid et je pensais que c'était exactement le type de problème utilisant des génériques était censé éviter. < / p>

Ce que je veux vraiment faire est de préciser dans la signature de baseenté que toutes ses sous-classes seront comparables , mais uniquement aux instances de la même sous-classe.

Une assistance reçue avec gratitude. Merci!


3 commentaires

Je suis sûr que vous voulez trier une liste d'objets, pas des types?


Vous aurez donc une liste de la barre ou une liste de foo mais pas tous les deux dans le même? Votre myList est-il plus impliqué? Sinon, cela semble être une couche inutile qui provoque votre problème.


Oui, ma liste est soit foo ou bar , et oui, le myList est juste un échantillon du plus petit code possible qui montre le problème I 'm avoir. La vraie classe est beaucoup plus complexe.


4 Réponses :


1
votes

Essayez ceci:

static <T extends Comparable<? super T>> sort(T[] array);


0 commentaires

8
votes

Utilisez un type d'intersection, comme celui-ci:

public class MyList<T extends BaseEntity & Comparable<T>> {...}


7 commentaires

La classe MyList était juste un exemple pour afficher le message d'erreur. J'ai choisi un mauvais nom :-(, ce n'est pas réellement une liste de quelque chose et des instances de cette classe ont juste besoin d'effectuer le tri, pas réellement être triés eux-mêmes.


Je ne vois pas pourquoi cela changerait l'applicabilité de la réponse. :)


Parce que les génériques de Java 5 sont boiteux. L'erreur "comme essayer d'implémenter les deux comparable et comparable , qui n'est évidemment pas autorisé" le suggéra évidemment.


Oh oui, tu as raison. Que comparable s'applique à t , pas sur myList . Merci merci merci.


Pour de meilleurs résultats, utilisez >


@newacct cn u explique ce que > réellement fait?


@TUSUSHARBANNE: comparable est un consommateur et doit donc toujours être utilisé avec ? Super WILDCARDS, selon la règle PECS. Sans le ? Super Wildcard, si vous avez une classe comparable à elle-même, sa sous-classe ne peut pas être utilisée comme t ici, même si cela devrait être capable de.



2
votes

N'utilisez pas collections.sort (liste ) , utilisez collections.sort (liste , comparateur . Écrivez le code de comparaison dans le comparateur.


0 commentaires

0
votes

Vous pouvez créer une méthode de tri super simple qui peut gérer à peu près n'importe quel type de liste xxx

ceci signifie que vous pouvez appeler cette méthode pour trier n'importe quelle liste tant que la liste et le comparateur données sont du même type que l'autre. Cela fonctionnerait même sans la classe de base que vous avez (baseentité)


0 commentaires