对类使用泛型如何将值从一种类型转换为另一种类型?

时间:2017-01-03 16:29:54

标签: java generics

我构建了一个简单的文档存储,有些实体具有不同类型的字段,我有一个Float,Int和String类型。该实体包含值的数组列表,如果有人更新了我希望能够尝试将值转换为新类型的实体的架构。

public interface FieldType<T> {
    ArrayList<T> values;
}

public class FloatField implements FieldType<Float> {

}

public class StringField implements FieldType<String> {

}

我考虑过使用带有以下方法的抽象类

public abstract class Field<T> implements FieldType<T> {
  abstract public <T> castFromString(String value);
  abstract public <T> castFromFloat(Float value);
  abstract public <T> castFromInt(Int value);
}

public class FloatField extends Field<Float> {
  @override
  public <Float> castFromString(String value){
    Float castValue = null;
    try {
      castValue = Float.parseFloat(value);
    } catch(Exception e){

    }

    return castValue;
  }
}

我真的不喜欢这个解决方案,因为每次我向系统添加额外的类型时都需要添加一个新的抽象方法。

我有什么想法可以更好地实现这一点?

2 个答案:

答案 0 :(得分:1)

也许您可以使用Function<T, R> interface

  ID    |     Date           |  Sequence

  A        01/01/2015           3
  A        02/01/2015           2
  A        02/01/2015           2
  A        02/01/2015           2
  A        05/01/2015           1  
  B        01/01/2015          ...

然后使用lambda expressionmethod reference

指定转换器
public abstract class Field<T> implements FieldType<T> {

    ...

    public <F> T convert(F value, Function<F, T> converter) {
        try {
            return converter.apply(value);
        } catch(Exception e) {
            return null;
        }
    }

    ...

}

这会将所有field.convert("1234", BigDecimal::new); //with a method reference field.convert("1234", s -> new BigDecimal(s)) //with a lambda 方法替换为1,因为返回类型是从传递的convertXXX推断的。

编辑: 如果您想要自动转换,您当然必须对这些进行硬编码,因为您不希望为Java API中的所有4240类编写转换方法。但这会变得混乱。在静态助手类或Function本身中可能是这样的吗?

FieldType

答案 1 :(得分:0)

我认为你不需要仿制药。相反,只需尝试从输入Float创建String,如果出现问题,则返回null

public Float castFromString(String value) {
    Float castValue = null;
    try {
      castValue = Float.parseFloat(value);
    } catch(Exception e){
        // log here
    }

    return castValue;
}

我不认为需要泛型的原因是转换中涉及的类型在您的帮助方法中命名/已知。