gpt4 book ai didi

java - 如何通过字符串声明已知其类型的变量类型

转载 作者:行者123 更新时间:2023-12-01 09:37:19 26 4
gpt4 key购买 nike

我正在尝试使用 json 文档声明变量类型...问题是我需要声明其类型 Long 或 Double,这取决于字符串,例如:

原始值是 double 值:

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

这也是一个 Double:

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

但这很长:

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

我在“fmt”字段上使用正则表达式,这样我就可以知道类型,但我遇到的问题是在声明类型时

我正在尝试执行此操作,但出现错误,而且我不知道确切原因。

这是我的“Field”类:

    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;
}
}

最佳答案

泛型类RawField<E extends Number>因为 E 要么是 Long 要么是 Double 很麻烦,因为类型删除。

所以我会使用基本类型 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 比 double 更有优势,其精度为: new BigDecimal("3.14")精度为 2,并且是精确的。

关于java - 如何通过字符串声明已知其类型的变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38766690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com