【问题标题】:Convert from Object to anything (conditionally)从对象转换为任何东西(有条件地)
【发布时间】:2016-04-12 12:41:14
【问题描述】:

我有一个方法需要检查 Object 的值并确定其数据类型,然后将传入的 value 转换为适当的格式化 java 数据类型。有没有更优雅的方法来做到这一点?转变?功能性?

我正在使用 Apache Chemistry。目标是转换为 CMIS 将接受的类型。我尝试的原始代码是使用他们的 API 来做:PropertyType type = PropertyType.fromValue(value);最初,我打算使用这种类型来确定如何进行转换。但是,fromValue 方法总是返回 null,所以我需要从值本身获取类型。

这是它最初的样子(使用化学 API):

PropertyType type = propertyDefinition.getPropertyType();
if (type.equals(PropertyType.BOOLEAN) {
   return Boolean.parseBoolean(value);

这只能通过关闭 CMIS 连接的类型来实现。我还需要它从属性文件中获取类型,因此我无法访问 API,只有值。

if (value instanceOf Boolean) {
    return Boolean.parseBoolean(value);
} else if (value instanceof Integer) {
    return Integer.parseInt(value);
} else if (value instanceof Double) {
    return Double.valueOf(value);
} else if (value instanceof DateTime) {
    DateTimeFormatter dateFormat = new DateTimeFormatterFactory(format)
        .createDateTimeFormatter();
    return dateFormat.parseDateTime(value).toDate();
} else if (value instanceof String) {
    return value;
}

【问题讨论】:

  • 您的代码解决了需要这种转换的更大问题是什么?只是问问。
  • 如果valueBoolean,你到底为什么要将它传递给Boolean.parseBoolean(),它将String 转换为Boolean?对于您的其他类型也是如此。
  • 你在做什么没有任何意义。无论您如何处理参数,您的方法返回的对象类型都非常不同,以至于其声明的返回类型只能是Object。在某些情况下,明显的意图——不一定实现——是返回一个在类型和值上与输入对象等效的对象(但声明了类型Object)。有什么意义?
  • 我假设这个函数必须声明为返回Object(否则它不会编译),对吧?在那种情况下,是的,有一种“更优雅的方式”:return value
  • 请不要尝试将代码放入 cmets。如果您有更多信息可以增强/澄清您的问题,请编辑您的问题并添加它。

标签: java instanceof apache-chemistry


【解决方案1】:

我不确定我是否正确理解了您的问题,但我认为您有一个名为 value 的对象,并且您想检查它是什么类型的对象并为其设置适当的 PropertyType。如果是这种情况,试试这个:

if (value instanceOf Boolean) {
    return PropertyType.BOOLEAN;
} else if (value instanceof Integer) {
    return PropertyType.INTEGER;
} else if (value instanceof Double) {
    return PropertyType.DECIMAL; // well, sort of, maybe.
} else if (value instanceof DateTime) {
    return PropertyType.DATETIME;
} else if (value instanceof String) {
    return PropertyType.STRING;
}

【讨论】:

  • 我很欣赏这个答案,但这不是我想要的。我正在从一种 PropertyType.BOOLEAN 转换。
  • 我无法从属性文件中使其正常工作,因此返回使用开放连接并在他们的文档中找到了这一点:chemistry.apache.org/java/examples/…
  • 我明白了。所以变量value是从Property.getValue()方法获得的,它可以是多种类型中的任何一种,例如IntegerString等。回到你原来的问题,你不能有一个方法返回不同的类型。您只能返回作为所有可能返回类型的超类型的类型的实例。但这已经是value 的含义:Object 的一个实例。您要做的是根据 value 的类型以不同的方式处理它。您可以对instanceof 测试的每个分支进行特定类型的处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 2010-09-24
  • 2015-10-03
相关资源
最近更新 更多