我一直在努力解决这个问题,但还没有找到答案.结果,我的大脑有些混乱,所以如果我犯了一个愚蠢的错误,请原谅我.
我正在尝试实现一个类型化的INI解析器,它将解析这种文件:
[section1]
<int>intkey=0
<float>floatkey=0.0
<str>stringkey=test
[section2]
<float>x=1.0
<float>y=1.0
<float>z=0.0
在这样做时,我有一个名为Config的中心类,它处理基本的读写操作. Config的一种方法叫做get(String section,String key),它理想情况下会返回一个适合所请求的section-key对的值,如下所示:
Config cfg = new Config("test.ini");
cfg.get("section2", "x"); // 1.0, not "1.0" or some Object that technically represents the float
cfg.get("section1", "intkey"); // 0
cfg.get("section1", "strkey"); // "test"
我目前正在使用枚举来处理String到各种类型的转换,其中一个抽象方法被不同类型覆盖:
enum Type
{
INTEGER ("int") {
public Object parse(String value) {
try
{
return Integer.parseInt(value);
} catch (NumberFormatException e)
{
return null;
}
}
},
FLOAT ("float") {
public Object parse(String value) {
try
{
return Float.parseFloat(value);
} catch (NumberFormatException e)
{
return null;
}
}
},
STRING ("str") {
public Object parse(String value) {
return value;
}
};
public final String name;
Type(String name)
{
this.name = name;
}
private static HashMap<String, Type> configMap = generateConfigMap();
private static HashMap<String, Type> generateConfigMap()
{
HashMap<String, Type> map = new HashMap<String, Type>();
for (Type type : Type.values())
map.put(type.name, type);
return map;
}
public static Type get(String name)
{
return configMap.get(name);
}
abstract public Object parse(String value);
}
不幸的是,parse(String value)返回一个Object,当从Config中传出时,需要一个强制转换或类似的,理想情况下这将是自包含的.
如果我对此完全错误并且有更灵活或更简单的编码方式,请告诉我.我愿意接受建议.虽然我想知道是否有办法做到这一点.也许用泛型……?
注意:我知道我缺少进口等.这不是我在这里发帖的原因.
最佳答案 这就是事情.如果调用config.get()的代码不知道期望什么类型,则不可能返回除Object以外的任何内容,因为调用代码不知道会发生什么.当然你必须投.
现在,如果你想以一种调用者确实知道它要求的类型的方式来设计Config,那么这就变得容易了.最简单的方法是做这样的事情:
public class Config {
public int getInt(String a, String b) {
return ((Integer)get(a, b)).intValue();
}
}
但是直到来电者知道会发生什么,你才真正从避免演员阵容中获益.