5

サンプル プロジェクトのクラスがあります。しかし、このクラスを使用すると、いくつかのエラーが表示されます。クラスを以下に示します。

public  class q extends Enum
{

    private int i = -1;
    private String s = null;

    private q(String s, int i)
    {
       // super(s, i);
        this.s = s;
        this.i  = i;
    }

    public static q valueOf(String s)
    {
        return (q)Enum.valueOf(q.class, s);
    }

    public static q[] values()
    {
        return (q[])a.clone();
    }

    public static final q ANDROID_VERSION;
    public static final q APP_VERSION_CODE;
    public static final q APP_VERSION_NAME;
    public static final q AVAILABLE_MEM_SIZE;
    private static final q a[];

    static 
    {
        APP_VERSION_CODE = new q("APP_VERSION_CODE", 1);
        APP_VERSION_NAME = new q("APP_VERSION_NAME", 2);
        ANDROID_VERSION = new q("ANDROID_VERSION", 6);
        AVAILABLE_MEM_SIZE = new q("AVAILABLE_MEM_SIZE", 11);
        q aq[] = new q[34];
        aq[0] = APP_VERSION_CODE;
        aq[1] = ANDROID_VERSION;
        aq[2] = APP_VERSION_NAME;
        aq[3] = AVAILABLE_MEM_SIZE;
        a = aq;
    }

}

Enum を拡張すると、「型 q は Enum を明示的にサブクラス化できない可能性があります」というエラーが表示されます。これらのフィールドを使用して列挙型を作成するにはどうすればよいですか?

このクラスを enum のように使用するように変更するにはどうすればよいですか (つまり、ordinal()、valueOf(...) などのデフォルトの enum メソッドを使用したい)。

4

3 に答える 3

6

から延長することはできませんEnumEnum次のようなクラスを宣言する必要があります。

public enum Q {
    TYPE1, TYPE2, TYPE3;
}

また、enum クラスを直接インスタンス化することもできません。列挙型クラスの各タイプは、仮想マシンによって 1 回だけインスタンス化されます。

public class MyClass {

    public enum MyEnum{
        TYPE1("Name", 9,1,100000), TYPE2("Name2", 10, 1, 200000);

        private final int androidVersion;
        private final int appVersionCode;
        private final int availableMemSize;
        private final String appVersionName;

        private MyEnum(String appVersionName, int androidVersion, int appVersionCode, int availableMemSize) {
            this.androidVersion = androidVersion;
            this.appVersionCode = appVersionCode;
            this.availableMemSize = availableMemSize;
            this.appVersionName = appVersionName;
        }
    }
    MyEnum mType = MyEnum.TYPE1;
}
于 2012-12-13T09:05:28.787 に答える
5

列挙型は基本的に次のようなものに要約されます。

public Enum Q
{
    TYPE1, TYPE2, TYPE3:
}

// is roughy translated to 

public final class Q
{
    private Q() {}

    public static final Q TYPE1 = new Q();
    public static final Q TYPE2 = new Q();
    public static final Q TYPE3 = new Q();
}

できることは他にもありますが、インスタンス化できない理由はこれで説明できますQ

于 2012-12-13T09:15:35.887 に答える
3

-enumキーワードをシンタックス シュガーと考えてください。通常の継承ツリーを使用してクラスをセットアップしますが、拡張することはできません java.lang.Enum

例えば:

public enum TEST {  
    ONE, TWO, THREE;
}
于 2012-12-13T09:11:16.027 に答える