5

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

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

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

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

这种尝试在方法声明中已经失败,因为 Java 中的枚举似乎不能有类型参数。关于如何实现与此类似的任何想法?

4

5 回答 5

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;
    }
}
于 2012-09-26T15:30:34.513 回答
2

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

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

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

于 2012-09-26T14:55:01.003 回答
0

您可以初始化一个 Map<Class, String>,并为此添加一个方法。

评论后编辑

Map<Class, Enum>,如果 objectParameter 是FIRST_KEYLongget(objectParameter.getClass())

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

于 2012-09-26T14:54:34.037 回答
-1

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

public <T extends Enum> T getValue(key, Class<T extends Enum> enumClazz) {
    return enumClazz.cast(...);
}
于 2012-09-26T14:53:55.547 回答
-1

在你的枚举中有一个 getType 方法,然后用它来帮助你转换你的字符串。

枚举中的 getType()。

 public Class getType()
 {      
    return type;    
 } 

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

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

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

于 2012-09-26T15:25:39.950 回答