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


    }

}