Java泛型选择性返回值

标签 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),理想情况下它会返回一个适合请求的部分- 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) 返回一个 Object,当从 Config 中传递出来时,需要强制转换或类似的转换,理想情况下这是自包含的。

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

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

最佳答案

事情是这样的。如果调用 config.get() 的代码不知道要返回什么类型,则您不可能返回除 Object 以外的任何内容,因为调用代码不知道要返回什么。当然,您必须转换。

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

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

但是,在调用者知道会发生什么之前,避免强制转换你真的一无所获。

关于Java泛型选择性返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970926/

相关文章:

java - 在 Java 7 源代码级别编译 GWT 2.6.1

java - 使用 Spring Security for REST API 进行基本身份验证中的用户权限

java - 是否有任何完全通用的 Map.get() 版本,即 "V get(K key)"

Java:参数化数据类型和非具体类型

java - 如何在任何语言中翻转整数中特定位置的位

java - 为什么我在reportview中出现错误

Java字符串解析器查找字符串,保存并打印它

c# - 写一个C#脚本测试上百个域名

php - PHP解析/语法错误;以及如何解决它们

Java - 当方法名称不同时将代码提取到泛型方法