为什么int []被视为对象而不是对象数组

时间:2014-07-12 01:40:37

标签: java json

我在java中创建了一个JSON构建器库,我的lib有一点bug。我注意到因为当我改变"诉讼的类型时#34;变量到int[]而不是Integer[]我的lib停止正常工作。我的想法是让第二个addProperty(..., Object[] value)方法重载第一个方法addProperty(..., Object value).

package mypack;

public class JSON {
    private static String $s = "\"";
    private String name, json = "{";

    public JSON() {
        this.name = null;
    }

    public JSON(String name) {
        this.setName(name);
    }

    public void setName(String name){
        this.name = "var " + name + " = ";
    }

    public String getJson() {
        return json;
    }

    public void addAttribute(String attribute, Object value){
        json += $s + attribute + $s + ": ";

        if(value instanceof JSON){
            json += ((JSON) value).json + ", ";
        } else if (value instanceof String) {
            json += $s + value + $s + ", ";
        } else {
            json += value + ", ";
        }
    }

    //THIS SHOULD BE USED BY int[].... I think :(
    public void addAttribute(String attribute, Object[] value){
        json += $s + attribute + $s + ": [";

        for (int i = 0; i <value.length; i++) {
            if(value[i] instanceof JSON){
                json += ((JSON) value[i]).json + ", ";
            } else if (value[i] instanceof String) {
                json += $s + value[i] + $s + ", ";
            } else {
                json += value[i] + ", ";
            }
        }
        json = json.substring(0, json.length() - 1) + "], ";
    }

    public void build(){
        json = json.substring(0, json.length() - 2) + "}";
        json = (name == null) ? json : (name + json);
    }
}

为了测试它我使用了这个:

package mypack;

public class Test {
    public static void main(String[] args){
        int[] suit = {1,2,3};
        JSON json = new JSON();
        json.addAttribute("x", "suit");
        json.addAttribute("y", suit );
        json.build();
        System.out.print(json.getJson());
    }
}
PD:请不要回答建议使用预制的lib。我正在学习,在大学里我们习惯做西西弗斯学生,一遍又一遍地重做,直到时间结束。

1 个答案:

答案 0 :(得分:5)

我认为这是对您问题的简化重写:

public class Foo {

    public static void main(String[] args) throws Exception {
        foo(new int[]{1,2,3});
    }

    static void foo(Object o) {
        System.out.println("object");
    }

    static void foo(Object[] o) {
        System.out.println("array");
    }
}
  

为什么打印&#34;对象&#34;而不是&#34;数组&#34;?

答案:int[]不是Object[]的子类型,因为int不是Object的子类型。

Java的类型层次结构没有supremum,所以不幸的是,用一个可以是任何类型(或任何数组)的参数编写方法是不可能的。这就是为什么,如果您查看java.util.Arrays之类的API,您会看到许多方法在byte[]char[]double[],{{ 1}},float[]int[]long[]short[]