Java - 枚举值的返回类型

时间:2016-04-18 12:24:44

标签: java generics enums

美好的一天SO人。我有关于返回枚举的内部枚举值的问题。我不知道要使用哪种返回类型。我试过谷歌搜索并碰到了一些使用仿制药的解决方案但是,我仍然没有运气。我不知道我的问题是否有解决方案,或者我的设计可能不好。所以这里,下面 是我的枚举。

public enum KEYS
{
    A("value"),
    B("value"),
    C("value");

    public enum KEYS_GROUP_A
    {
        ITEM_A ("value"),
        ITEM_B ("value"),
        ITEM_C ("value");

        private String value;
        private KEYS_GROUP_A( String _value )
        {
            value = _value;
        }

        public String getVal()
        {
            return value;
        }
    }

    public enum KEYS_GROUP_B
    {
        ITEM_A ("value"),
        ITEM_B ("value"),
        ITEM_C ("value");

        private String value;
        private KEYS_GROUP_B( String _value )
        {
            value = _value;
        }

        public String getVal()
        {
            return value;
        }
    }

    public enum KEYS_GROUP_C
    {
        ITEM_A ("value"),
        ITEM_B ("value"),
        ITEM_C ("value");

        private String value;
        private KEYS_GROUP_C( String _value )
        {
            value = _value;
        }

        public String getVal()
        {
            return value;
        }
    }

    private String value;
    private PROPERTY_KEYS(String _value)
    {
        value = _value;
    }

    public String getVal()
    {
        return value;
    }

    public <?> getEnumValues(int x)
    {
        if ( 0 == x )
        {
            return KEYS.KEYS_GROUP_A.values();
        }
        else if ( 1 == x )
        {
            return KEYS.KEYS_GROUP_B.values(); 
        }
        else
        {
            return KEYS.KEYS_GROUP_C.values();
        }
    }
}

我要做的是getEnumValues()方法。我尝试了返回类型<T extends Enum<T>> T,但仍然发生错误。请告诉我的设计是不好还是不应该做。请说明一些参考资料。我愿意阅读和学习。请轻松一点!提前谢谢!

1 个答案:

答案 0 :(得分:3)

您可以返回的最具体类型是

java.exe

如果您定义如下界面,则可以返回更“有用”的类型:

public Enum<?>[] getEnumValues(int x)

然后让你的枚举全部实现该接口,例如:

interface HasVal { String getVal(); }

然后你可以返回

public enum KEYS_GROUP_A implements HasVal {
  // ...

  @Override public String getVal() { return value; }
}

并且能够在实例上调用public HasVal[] getEnumValues(int x) 方法:

getVal

你不能使用:

for (HasVal val : getEnumValues(x)) {
  System.out.println(val.getVal());
}

因为这对于一般public <T extends Enum<T>> T[] getEnumValues(int x) 来说是不可满足的。例如,我可以定义:

T

然后尝试调用:

enum Blah {}

这不是类型安全的,因为至少有一个(好吧,全部,实际上)代码路径返回一个与Blah[] blah = getEnumValues(1); 不协变的值。

相关问题