Если у вас нет параметра универсального типа, вы не сможете расширить Comparable<T extends Comparable>
для определенного подтипа enum, который вы создали.
Вы можете игнорировать это и создать свой собственный тип MyEnum, который ведет себя примерно одинаково, но без ограничения, что разные MyEnum не сравнимы:
public abstract class MyEnum implements Comparable<MyEnum>
{
private final int ordinal;
protected MyEnum ( int ordinal )
{
this.ordinal = ordinal;
}
public int ordinal ()
{
return ordinal ;
}
public int compareTo ( MyEnum other )
{
return ordinal - other.ordinal; // ignore overflow for now
}
public boolean equals (Object other) {
return ordinal == ((MyEnum)other).ordinal;
}
public int hashCode () {
return ordinal;
}
}
Это ведет себя во многом так же, как перечисление для определенных операций, но вместо того, чтобы быть безопасной реализацией универсального типа, подчиняется LSP - объекты разных подклассов MyEnum сравнимы или равны друг другу если они имеют одинаковое порядковое значение.
public static class EnumA extends MyEnum
{
private EnumA ( int ordinal ) { super ( ordinal ); }
public static final EnumA a = new EnumA ( 0 );
public static final EnumA b = new EnumA ( 1 );
}
public static class EnumB extends MyEnum
{
private EnumB ( int ordinal ) { super ( ordinal ); }
public static final EnumB x = new EnumB ( 0 );
public static final EnumB y = new EnumB ( 1 );
}
public static void main ( String...args )
{
System.out.println ( EnumA.a.compareTo ( EnumB.x ) );
System.out.println ( EnumA.a.equals ( EnumB.x ) );
System.out.println ( EnumA.a.compareTo ( EnumB.y ) );
System.out.println ( EnumA.a.equals ( EnumB.y ) );
}
В этом случае, если вы не переопределите equals
, вы потеряете соглашение, которое x.comparesTo(y)=0
подразумевает x.equals(y)
; если вы переопределяете equals, то в некоторых случаях x.equals(y)
не подразумевает x == y
(как для других объектов-значений), тогда как для перечислений Java оба теста на равенство дают один и тот же результат.