2012-10-25 15 views
16

Se enum implementa Comparable, quindi perché non può essere confrontato con < o>?Come non possiamo confrontare due valori enum con '<'?

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 }; 
+0

Che cosa ha a che fare questa domanda con SCJP/OCPJP? –

+0

** Esame ** Sezione 1 **: dichiarazioni, inizializzazione e scoping * Sviluppo di codice che dichiara le classi (incluse le forme astratte e tutte le classi nidificate), le interfacce e le enumerazioni e include l'uso appropriato del pacchetto e dichiarazioni di importazione (incluse le importazioni statiche). * Sviluppare codice che dichiari, inizializzi e utilizzi primitive, matrici, enumerazioni e oggetti come variabili statiche, di istanza e locali. Inoltre, utilizzare gli identificatori legali per i nomi delle variabili. http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_851 – Joe

risposta

31

Si può fare questo:

PinSize.BIGGEST.ordinal() > PinSize.BIG.ordinal() // evaluates to `true` 

Naturalmente, partendo dal presupposto che è stato dichiarato BIGGESTdopoBIG nell'enumerazione. Il valore ordinale in un'enumerazione è implicitamente legato all'ordine di dichiarazione, per impostazione predefinita il primo valore è assegnato al valore 0, il secondo valore 1 e così via.

Quindi, se yo dichiarato l'enumerazione come questo, le cose funzioneranno:

public enum PinSize { 
    SMALLEST, // ordinal value: 0 
    SMALL,  // ordinal value: 1 
    NORMAL, // ordinal value: 2 
    BIG,  // ordinal value: 3 
    BIGGER, // ordinal value: 4 
    BIGGEST; // ordinal value: 5 
} 
+0

+1 Se avevi "GRANDE" potrebbe essere il numero 4.;) –

+0

E 'corretto per dì che PinSize.BIGGEST è una variabile di riferimento come ad es int [] array; ? – MrKiller21

+0

@ miller.bartek 'Dimensione Pin.BIGGEST' è un valore enum, non è corretto confrontarlo con un array. E comunque, in Java tutte le variabili che puntano agli oggetti (incluse enumerazioni, array) sono riferimenti –

12

Implementazione Comparable non significa che è possibile utilizzare < o >. È possibile solo utilizzare quelli con valori numerici.

Significa solo che esiste un metodo compareTo(). Prova questo:

System.out.println(PinSize.BIG.compareTo(PinSize.BIGGER)); 

Questo metodo restituirà un int che è minore, uguale o maggiore di 0, a seconda di quale valore è "più grande". Nel caso dei valori enum la "dimensione" dipende dall'ordine delle definizioni del valore enum.

1

le risposte fornite a spiegare bene il problema, ma vorrei aggiungere le mie intuizioni, perché sento che non rispondono domanda "perché non è possibile confrontare con < o>" ?. Il problema si riduce al confronto dei riferimenti. PinSize.BIGGEST e PinSize.BIGGERER sono variabili di riferimento. Lo stesso di quanto segue:

String s; 
int[] array; 
MyObject myObject; 

Rappresentano gli indirizzi in memoria. Inoltre, le enumerazioni sono singleton, quindi c'è sempre un oggetto del tipo specificato. Per questo motivo la riga sottostante è consentita e restituisce true.

System.out.println(PinSize.BIG == PinSize.BIG); //true 

Provare a verificare se un indirizzo in memoria è maggiore o minore dell'altro indirizzo in memoria è impossibile. L'implementazione di un'interfaccia comparabile e il metodo compareTo() offre la possibilità di fornire il proprio modo personalizzato di confrontare gli oggetti e non gli indirizzi in memoria.

System.out.println(PinSize.BIG > PinSize.BIGGERER); // not possible