28

如果枚举实现了 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 };
4

3 回答 3

45

你可以这样做:

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

当然,假设是在枚举之后BIGGEST 声明的。枚举中的序数值隐式地与声明顺序相关联,默认情况下,第一个值被分配 value ,第二个值等等。 BIG01

所以如果你像这样声明枚举,事情会起作用:

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
}
于 2012-10-25T13:59:43.520 回答
18

实现并不意味着你可以使用or 。您只能使用带有数值的那些。Comparable <>

实施Comparable意味着有一种compareTo()方法。尝试这个:

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

compareTo()方法将返回int小于、等于或大于 0 的值,具体取决于哪个值“更大”。在enum值的情况下,“大小”取决于枚举值定义的顺序。

于 2012-10-25T13:58:32.077 回答
2

提供的答案很好地解释了问题,但我想补充一下我的见解,因为我觉得他们没有回答“为什么不能与 < 或 > 比较”的问题?问题归结为比较参考文献。PinSize.BIGGEST 和 PinSize.BIGGERER 是参考变量。与以下相同:

String s;
int[] array;
MyObject myObject;

它们代表内存中的地址。更重要的是,枚举是单例的,所以总是有一个指定类型的对象。因此,允许以下行并返回 true。

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

试图检查内存中的一个地址是大于还是小于内存中的另一个地址是不可能的。实现 Comparable 接口和 compareTo() 方法可以提供您自己的自定义方法来比较对象而不是内存中的地址。

System.out.println(PinSize.BIG > PinSize.BIGGERER); // not possible
于 2012-10-25T14:29:59.663 回答