在java数组中存储任意基元类型

时间:2016-04-08 03:50:20

标签: java arrays generics primitive primitive-types

我有一个用例,我必须在Java中将JSON解析为原始值。我在JSON中嵌入了指导性字段,通知我解析要反序列化的原语。必须将这些基元类型添加到某个长度的数组中。

所以我可能会有这样的JSON:

"primitives" : [
{
"valueType" : "int",
"value" : 3
},
{
"valueType" : "double",
"value" : 4
},
]

我已经编写了代码来正确地将这个JSON解析为两个原语,一个是int,双重的是值为3和4.但是,因为我将它们添加到一个期望对象的ArrayList,它们被自动装入Java的Integer和Double类型。我想过使用常规的Java数组,但是仍然存在指定类似Object[] arr的元素类型的问题,我有同样的问题,或int[]我太具体了。

Java中是否有一些功能可以让我将这个JSON解析为正确的基元数组。

我考虑过的一个解决方案是将所有不同的基元作为属性的对象,但如果语言级路径可用,这似乎太复杂了。

1 个答案:

答案 0 :(得分:2)

假设保持原始排序(因此是单个数组)很重要,并且跟踪类型很重要,并且使用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;
        }


    }

}