Как мы не можем сравнивать два значения 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 };
Ответы
Ответ 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