我有一个基本的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不能具有类型参数。关于如何实现与此相似的任何想法?
答案 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