28

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

3 に答える 3

45

あなたはこれを行うことができます:

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

もちろん、それが列挙のBIGGESTで 宣言されたと仮定します。列挙型の序数値は、宣言の順序に暗黙的に関連付けられています。デフォルトでは、最初の値に値が割り当てられ、2番目の値に値が割り当てられます。 BIG01

したがって、yoがこのように列挙を宣言した場合、状況は機能します。

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

実装することは、またはを使用できることを意味するものではありません。数値のあるもののみ使用できます。Comparable <>

実装とは、メソッドComparableがあることを意味しcompareTo()ます。これを試して:

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

このcompareTo()メソッドはint、どちらの値が「大きい」かに応じて、0より小さい、等しい、または大きいanを返します。値の場合enum、「サイズ」は列挙値定義の順序によって異なります。

于 2012-10-25T13:58:32.077 に答える
2

提供された回答は問題をよく説明していますが、「なぜ<または>と比較できないのか」という質問には答えられないと感じているので、私の洞察を追加したいと思います。問題は、参照の比較にあります。PinSize.BIGGESTとPinSize.BIGGERERは参照変数です。以下と同じ:

String s;
int[] array;
MyObject myObject;

それらはメモリ内のアドレスを表します。さらに、列挙型はシングルトンであるため、指定された種類のオブジェクトは常に1つあります。そのため、以下の行が許可され、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 に答える