为什么为重载方法选择Object而不是具有基元数组的Object[]



当我运行此代码时:

class Test {
    public static void main(String[] args) throws Exception {
        someMethod(new int[] {1, 2, 3});
    }
    static void someMethod(Object obj) {
        System.out.println("Single object given: " + obj);
    }
    static void someMethod(Object[] objs) {
        System.out.println("Multiple objects given: " + Arrays.toString(objs));
    }
}

我得到其中someMethod(Object[] objs)被选择用于int[]:的输出

Single object given: [I@140e19d

当我试图记录这样的消息时,我遇到了这样的行为:

logger.log(Level.INFO, "param1: {0}, param2: {1}", new int[] {1, 2});

输出:

...
INFO: param1: [I@103dbd3, param2: {1}

那么,为什么选择Object而不是Object[]作为基元数组的方法参数呢?

因为int[]不是Object[]——就这么简单。Object[]的元素必须是引用,而int[]的元素是而不是引用。

JLS第4.10.3节讨论了数组的子类型关系,特别是:

如果ST都是引用类型,则S[] >1 T[]等于S >1 T

最新更新