【问题标题】:Why is selected Object instead of Object[] with primitive array for overloaded methods?为什么为重载方法选择带有原始数组的 Object 而不是 Object[]?
【发布时间】:2015-06-29 19:13:47
【问题描述】:

当我运行这段代码时:

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[]

标签: java arrays overloading primitive


【解决方案1】:

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

JLS section 4.10.3 谈到了数组的子类型关系——特别是:

如果ST 都是引用类型,那么S[] >1 T[] iff S >1 T

【讨论】:

  • 好的,这不是我认为的错误 :) 感谢规范链接。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2011-01-12
  • 2021-01-29
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多