2016-08-04 31 views
1

我想声明一个变量类型使用JSON文档... 问题是,我需要声明它的类型长或双,这取决于字符串,例如:如何声明一个变量类型知道它的类型由一个字符串

原始值是双:

{"raw":119970000,"fmt":"119.97M","longFmt":"119,970,000"} 

这是一个双太:

{"raw":0.068,"fmt":"6.80%"} 

,但这是一个长期的:

{"raw":1443571200,"fmt":"2015-09-30"} 

我使用的“格式化”领域正则表达式,所以我知道的类型,但我得到了proble是在宣布

我试图做这个类型的时刻,但有一个错误,我不知道为什么。

这是我的“场”类:

public class Field { 

     @JsonProperty("raw") private RawField raw; 
     @JsonProperty("fmt") private String fmt; 
     @JsonIgnore private FieldType fieldType; 

     @JsonCreator 
     public Field(
     @JsonProperty("raw") RawField raw, 
     @JsonProperty("fmt") final String fmt 
    ) { 
     this.setFmt(fmt); 
     this.setRaw(raw, fmt); 
     } 

     private boolean isDate(String fmt){ 
     Pattern datePattern = Pattern.compile(
      "[0-9]{4}-(([1][0-2])|(0[0-9]))-((0[1-9])|(1[0-9])|(2[0-9])|(3[0-1]))" 
     ); 
     Matcher matcher = datePattern.matcher(fmt); 
     return matcher.find(); 
     } 

     private boolean isDouble(String fmt) { 
     Pattern datePattern = Pattern.compile(
      "[0-9]+\\.?[0-9]*(M|B|%)?$" 
     ); 
     Matcher matcher = datePattern.matcher(fmt); 
     return !isDate(fmt) && matcher.find(); 
     } 


     public String getFmt() { 
     return fmt; 
     } 

     public void setFmt(final String fmt) { 
     this.fmt = fmt; 
     } 

     public RawField getRaw() { 
     return raw; 
     } 

     public void setRaw(final RawField raw) { 
     this.raw = raw; 
     } 

     private void setRaw(final RawField raw, String fmt) { 
     if(isDate(fmt)) { 
      this.raw = new RawField<Long>(raw); //error 
     } else { 
      if(isDouble(fmt)){ 
      this.raw = new RawField<Double>(raw); //error 
      } 
     } 


     } 
    } 

,这是我RawField类:

public class RawField <E> { 

    @JsonProperty("raw") private E rawField; 

    @JsonCreator 
    public RawField (E rawField){ 
    this.setRawField(rawField); 
    } 

    @JsonProperty("raw") 
    public void setRawField(E rawField) { 
    this.rawField = rawField; 
    } 
    @JsonProperty("raw") 
    public E getRawField() { 
    return rawField; 
    } 
} 
+0

使用数字(基类)或BigDecimal(全功能瑞士刀)。 –

+0

我想我不明白你...你可以告诉我你的解决方案吗?谢谢。 –

回答

1

通用类RawField<E extends Number>为E是无论长发还是双很麻烦,因为类型擦除。

所以我请使用碱型,Number,或一在-所有的BigDecimal

Number raw; 

private void setRaw(final RawField raw, String fmt) { 
    if(isDate(fmt)) { 
     long t = ... 
     this.raw = t; 
    } else { 
     if(isDouble(fmt)) { 
     double x = .... 
     this.raw = x; 
     } 
    } 
    } 

    double y = field.raw.doubleValue(); 
    long n = field.raw.longValue(); 
    if (field.raw instanceof Double) { ... } 

的BigDecimal将具有优于双由具有精度:new BigDecimal("3.14")具有2的精度和是确切的。

相关问题