Java中的通用枚举

时间:2012-09-26 14:48:26

标签: java generics enums

我有一个基本的Configuration类,它提供了所有可能的键以及枚举中相应值类型的类型,如下所示:

public class Configuration {
    public static enum Key {
        FIRST_KEY("actual key 1", Long.class),
        ANOTHER_KEY("actual key 2", Integer.class)

        public final String value;
        public final Class type;

        Key(String value, Class type) {
            this.value = value;
            this.type = type;
        }
    }
}

我想要做的是编写一个方法,从String解析给定键的值,并将值作为适当的类型返回。基本上这个:

public <T> T getValue(Key<T> key, String valueStr);

此尝试在方法声明中已失败,因为它看起来Java中的Enums不能具有类型参数。关于如何实现与此相似的任何想法?

5 个答案:

答案 0 :(得分:3)

你可以简单地

public <T> T getValue(Key key, String valueStr);

它缺少编译时检查,所以这将通过编译

Short value = getValue(FIRST_KEY, string);  // should be Long

更好的答案?不要使用enum!让Key<T>成为一个普通的班级。

public static class Key<T>
{
    public static final Key<Long> FIRST_KEY 
                  = new Key("actual key 1", Long.class);
    ...

    public final String value;
    public final Class<T> type;

    Key(String value, Class<T> type) {
        this.value = value;
        this.type = type;
    }
}

答案 1 :(得分:2)

我在getValue()方法中提供了一个类型提示,例如

public <T> T getValue(Key k, Class<T> type);

您可以通过检查密钥来检查方法中的类型是否正确。

答案 2 :(得分:0)

您可以初始化Map&lt; Class,String&gt;,并为此添加方法。

评论后编辑

Map<Class, Enum>,如果objectParameter为long,则为FIRST_KEY提供get(objectParameter.getClass())

当然,如果Long有多个键: Map<Class, Set< Enum>>并从您正在使用的环境中选择结果。

答案 3 :(得分:-1)

您必须将枚举类作为参数传递:

public <T extends Enum> T getValue(key, Class<T extends Enum> enumClazz) {
    return enumClazz.cast(...);
}

答案 4 :(得分:-1)

在Enum中使用getType方法,然后使用它来帮助转换字符串。

Enum中的getType()。

 public Class getType()
 {      
    return type;    
 } 

使用getType()方法来帮助转换字符串。

 public Object getValue(Key key , String strValue)
 {
    return key.getType().cast(strValue) ;   
 }

您可能必须编写一个IF语句来解决如何解析不同对象的String,例如for Integer使用Integer.parseInt(s)方法,否则你将获得ClassCastExcpetion