在 java 数组中存储任意基本类型
Storing arbitrary primitive types in an a java array
我有一个用例,我必须将 JSON 解析为 Java 中的原始值。我在 JSON 中嵌入了指示字段,这些字段通知我解析要反序列化到哪个原语。这些基本类型必须添加到一定长度的数组中。
所以我可能有一些 JSON 这样的:
"primitives" : [
{
"valueType" : "int",
"value" : 3
},
{
"valueType" : "double",
"value" : 4
},
]
我已经编写了代码以将此 JSON 正确解析为两个原语,一个 int 和一个 double,其值为 3 和 4。但是,因为我将它们添加到一个 ArrayList 中,该数组期望对象被自动装箱到Java 的 Integer 和 Double 类型。我想过使用常规 Java 数组,但仍然存在指定元素类型的问题,例如 Object[] arr
我遇到同样的问题,或者 int[]
我过于具体。
Java 中是否有一些功能可以让我将这个 JSON 解析为正确的基元数组。
我考虑过的一个解决方案是将所有不同的基元作为属性的对象,但如果语言级路径可用,这似乎太复杂了。
假设保持原始顺序(因此是单个数组)很重要,并且跟踪类型很重要,并且使用 JSON 解析器不可用,我会考虑类似的东西以下。
enum ValueType { INT, DOUBLE, FLOAT };
static abstract class ParsedValue<T>
{
private final T data;
private final ValueType type;
public ParsedValue(T val, ValueType t)
{
data = val;
type = t;
}
public ValueType getType()
{
return type;
}
public T getValue()
{
return data;
}
}
static class IntParsedValue extends ParsedValue<Integer>
{
public IntParsedValue(Integer val)
{
super(val, ValueType.INT);
}
}
static class DoubleParsedValue extends ParsedValue<Double>
{
public DoubleParsedValue(Double val)
{
super(val, ValueType.DOUBLE);
}
}
public static void main(String[] args)
{
List<ParsedValue<?>> lst = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 25; ++i) {
ParsedValue<?> pv;
if (rnd.nextInt(2) == 0) {
pv = new IntParsedValue(rnd.nextInt(500));
}
else {
pv = new DoubleParsedValue(rnd.nextDouble());
}
lst.add(pv);
}
for (ParsedValue<?> pv : lst) {
switch (pv.getType()) {
case INT:
System.out.println("Integer: " + pv.getValue());
break;
case DOUBLE:
System.out.println("Double: " + pv.getValue());
break;
case FLOAT:
//...
break;
}
}
}
我有一个用例,我必须将 JSON 解析为 Java 中的原始值。我在 JSON 中嵌入了指示字段,这些字段通知我解析要反序列化到哪个原语。这些基本类型必须添加到一定长度的数组中。
所以我可能有一些 JSON 这样的:
"primitives" : [
{
"valueType" : "int",
"value" : 3
},
{
"valueType" : "double",
"value" : 4
},
]
我已经编写了代码以将此 JSON 正确解析为两个原语,一个 int 和一个 double,其值为 3 和 4。但是,因为我将它们添加到一个 ArrayList 中,该数组期望对象被自动装箱到Java 的 Integer 和 Double 类型。我想过使用常规 Java 数组,但仍然存在指定元素类型的问题,例如 Object[] arr
我遇到同样的问题,或者 int[]
我过于具体。
Java 中是否有一些功能可以让我将这个 JSON 解析为正确的基元数组。
我考虑过的一个解决方案是将所有不同的基元作为属性的对象,但如果语言级路径可用,这似乎太复杂了。
假设保持原始顺序(因此是单个数组)很重要,并且跟踪类型很重要,并且使用 JSON 解析器不可用,我会考虑类似的东西以下。
enum ValueType { INT, DOUBLE, FLOAT };
static abstract class ParsedValue<T>
{
private final T data;
private final ValueType type;
public ParsedValue(T val, ValueType t)
{
data = val;
type = t;
}
public ValueType getType()
{
return type;
}
public T getValue()
{
return data;
}
}
static class IntParsedValue extends ParsedValue<Integer>
{
public IntParsedValue(Integer val)
{
super(val, ValueType.INT);
}
}
static class DoubleParsedValue extends ParsedValue<Double>
{
public DoubleParsedValue(Double val)
{
super(val, ValueType.DOUBLE);
}
}
public static void main(String[] args)
{
List<ParsedValue<?>> lst = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 25; ++i) {
ParsedValue<?> pv;
if (rnd.nextInt(2) == 0) {
pv = new IntParsedValue(rnd.nextInt(500));
}
else {
pv = new DoubleParsedValue(rnd.nextDouble());
}
lst.add(pv);
}
for (ParsedValue<?> pv : lst) {
switch (pv.getType()) {
case INT:
System.out.println("Integer: " + pv.getValue());
break;
case DOUBLE:
System.out.println("Double: " + pv.getValue());
break;
case FLOAT:
//...
break;
}
}
}