2016-08-04 55 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的精度和是確切的。

相關問題