我们怎么能不将两个枚举值与'<'进行比较?

时间:2012-10-25 13:56:53

标签: java enums scjp ocpjp

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

3 个答案:

答案 0 :(得分:42)

你可以这样做:

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
}

答案 1 :(得分:17)

实施Comparable 意味着您可以使用<>。您只能 使用具有数值的那些。

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

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

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

答案 2 :(得分:1)

提供的答案很好地解释了问题,但我想补充一下我的见解,因为我觉得他们没有回答“为什么不能与&lt;或&gt;”进行比较的问题?问题归结为比较参考文献。 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