2010-10-29 28 views
1

Vu:Interface générique pour Comparator Sans avertissements

public interface PrimaryKey<Key extends Comparable> { 
    Key getKey(); 
} 

et

public class PrimaryKeyComparator implements Comparator<PrimaryKey> { 
    public int compare(PrimaryKey first, PrimaryKey second) { 
     return first.getKey().compareTo(second.getKey()); 
    } 
} 

Cette combinaison fonctionne, mais donne des avertissements sur les types bruts. J'ai essayé différentes manières d'ajouter les arguments de type, mais chaque combinaison que j'ai essayée casse le code.

+2

en utilisant comme générique 'key' des espaces réservés et' TKey' est un moyen très facile de confondre les gens qui lisent votre code. Il y a une raison pour laquelle Java utilise «E», «T», «K» et «V» comme noms d'espaces réservés. – Powerlord

+0

Tout à fait d'accord avec R. Bemrose. 'Key' ressemble au nom d'une classe ou d'une interface. – ColinD

Répondre

3

Essayez ceci:

public interface PrimaryKey<TKey extends Comparable<TKey>> { 
    TKey getId(); 
} 

public class PrimaryKeyComparator<TKey extends Comparable<TKey>> 
           implements Comparator<PrimaryKey<TKey>> { 
    public int compare(PrimaryKey<TKey> first, PrimaryKey<TKey> second) { 
     return first.getId().compareTo(second.getId()); 
    } 
} 
+0

Génial! Je vous remercie. –

+5

Le paramètre générique 'TKey' devrait être' > 'qui permet l'utilisation de classes implémentant les classes' Comparable' et non 'Comparable ', ou les sous-classes d'une classe 'Comparable '. – ColinD