Comment ne peut-on pas comparer les deux valeurs enum par '<'?
Si enum implémente Comparable alors pourquoi ne peux pas comparer avec < ou >?
public class Dream
{
public static void main(String... args)
{
System.out.println(PinSize.BIG == PinSize.BIGGER); //false
System.out.println(PinSize.BIG == PinSize.BIG); //true
System.out.println(PinSize.BIG.equals(PinSize.BIGGER));//false
System.out.println(PinSize.BIG > PinSize.BIGGERER);//compilation error
//can't be compared
System.out.println(PinSize.BIG.toString().equals(PinSize.BIGGER));//#4
PinSize b = PinSize.BIG ;
System.out.println( b instanceof Comparable);//true
}
}
enum PinSize { BIG, BIGGER, BIGGERER };
- Ce n'cette question a à voir avec le SCJP/OCPJP?
- C'est dans les sujets d'examen. chapitre 1: Déclarations, d'Initialisation et de Cadrage * Développer du code qui déclare les classes (y compris le résumé et toutes les formes de classes imbriquées), les interfaces, et les énumérations, et comprend l'utilisation appropriée de l'emballage et de déclarations d'importation (y compris statique des importations). * Développer du code qui déclare, initialise, et utilise les primitives, les tableaux, les énumérations et les objets statiques, de l'instance, et les variables locales. Aussi, l'utilisation légale des identificateurs pour les noms de variables. education.oracle.com/pls/web_prod-plq-dad/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire ceci:
Bien sûr, en supposant que
BIGGEST
a été déclaré aprèsBIG
dans l'énumération. La valeur ordinale dans une énumération est implicitement liée à la déclaration de la commande, par défaut, la première valeur est la valeur attribuée à l'0
, la deuxième valeur1
et ainsi de suite.Donc, si yo déclaré l'énumération comme cela, les choses vont fonctionner:
BIGGER
il pourrait être ordinale 4. 😉<
,>
. Ces opérateurs fonctionnent uniquement pour les types de base, commeint
,float
, etc. Pour la comparaison des références, utilisez la méthodecompareTo()
la mise en œuvre deComparator
si nécessaire.b1.compareTo(b2)
, plutôt que de comparer les résultats deordinal()
, compte tenu de l'Enum.ordinal javadoc: "la Plupart des programmeurs auront pas l'usage de cette méthode. Il est conçu pour une utilisation sophistiquée enum basé sur des structures de données, telles que EnumSet et EnumMap." Plus de la pensée sur ce, (mais pas le < / > cas particulier), Josh Bloch 2e ed l'article 31.La mise en œuvre de
Comparable
n'est pas signifie que vous pouvez utiliser<
ou>
. Vous pouvez seulement utiliser ceux avec des valeurs numériques.La mise en œuvre de
Comparable
signifie qu'il existe uncompareTo()
méthode. Essayez ceci:La
compareTo()
méthode retourne unint
qui est plus petit, égal ou plus grand que 0, en fonction de la valeur est "plus grande". Dans le cas deenum
valeurs, la "taille" dépend de l'ordre de la valeur d'enum définitions.Les réponses fournies expliquer le problème, mais je voudrais ajouter mes idées, parce que je sens qu'ils ne répondent pas à la question "pourquoi on ne peut pas comparer avec < ou >"?. Le problème revient donc à comparer les références. PinSize.PLUS grand et PinSize.BIGGERER sont les variables de référence. Le même que ci-dessous:
Ils représentent adresses dans la mémoire. Ce qui est plus, les énumérations sont des singletons, donc il y a toujours un objet du type spécifié. Parce que la ligne ci-dessous est autorisé et renvoie true.
Essayer de vérifier si une adresse en mémoire est plus grand ou plus petit que l'autre adresse en mémoire est impossible. La mise en œuvre interface Comparable et compareTo() la méthode donne une chance de fournir votre propre manière de comparer les objets qui ne sont pas les adresses en mémoire.