Java泛型选择性返回值

时间:2011-08-07 05:28:46

标签: java parsing generics methods return-value

我一直在努力解决这个问题并且尚未找到答案。结果,我的大脑有些混乱,如果我犯了一个愚蠢的错误,请原谅我。

我正在尝试实现一个类型化的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),理想情况下会返回一个适合所请求的段 - 密钥对的值,如下所示:

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"

我目前正在使用enum来处理String到各种类型的转换,其中abstract方法被不同类型覆盖:

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)会返回一个对象,当传递出Config时,需要一个演员或类似的东西,理想情况下这将是自包含的。

如果我认为这完全错误并且有更灵活或更简单的方法来编码,请告诉我。我愿意接受建议。虽然我想知道是否有办法做到这一点。也许用泛型......?

注意:我知道我缺少进口等。这不是我在这里发帖的原因。

2 个答案:

答案 0 :(得分:1)

如果你想根据你得到的东西返回一种类型的对象,你可以这样做:

public <T extends MyObject> T myMethod(Class<T> type) {
    return type.cast(myObj);
}

答案 1 :(得分:1)

这就是事情。如果调用config.get()的代码不知道期望什么类型,则不可能返回除Object以外的任何内容,因为调用代码不知道会发生什么。当然你必须施展。

现在,如果您想以调用者所做的方式设计Config 知道它要求的类型,那么这会变得容易一些。最简单的方法是做这样的事情:

public class Config {
    public int getInt(String a, String b) {
        return ((Integer)get(a, b)).intValue();
    } 
}

但是在调用者知道会发生什么之前,你真的从避免演员表中获得了什么。