Как мы не можем сравнивать два значения enum с '<'? - программирование
Подтвердить что ты не робот

Как мы не можем сравнивать два значения enum с '<'?

Если enum реализует Comparable, поэтому почему нельзя сравнивать с < или > ?

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 };
4b9b3361

Ответ 1

Вы можете сделать это:

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

Конечно, предполагая, что BIGGEST был объявлен после BIG в перечислении. Порядковый номер в перечислении неявно привязан к порядку объявления, по умолчанию первому значению присваивается значение 0, второе значение 1 и т.д.

Итак, если вы объявили нумерацию таким образом, все будет работать:

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
}

Ответ 2

Реализация Comparable не означает, что вы можете использовать < или >. Вы можете использовать только те, которые имеют числовые значения.

Это означает только метод compareTo(). Попробуйте следующее:

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

Этот метод возвращает int, который меньше или равен 0, в зависимости от того, какое значение "больше". В случае значений enum "размер" зависит от порядка определений значений перечисления.

Ответ 3

Полученные ответы хорошо объясняют проблему, но я хотел бы добавить свои идеи, потому что я чувствую, что они не отвечают на вопрос "почему нельзя сравнивать с <or> "?. Проблема сводится к сравнению ссылок. PinSize.BIGGEST и PinSize.BIGGERER являются ссылочными переменными. То же, что и ниже:

String s;
int[] array;
MyObject myObject;

Они представляют адреса в памяти. Более того, перечисления являются одиночными, поэтому всегда существует один объект указанного типа. Из-за этого разрешена строка внизу и возвращает true.

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

Попытка проверить, является ли один адрес в памяти большим или меньшим, чем другой адрес в памяти, невозможно. Внедрение метода Comparable interface и compareTo() дает возможность предоставить собственный способ сравнения объектов, а не адресов в памяти.

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