【问题标题】:Java automatically converting collections to arguments arrays?Java自动将集合转换为参数数组?
【发布时间】:2015-11-01 10:17:15
【问题描述】:

我知道Java“...”数组参数语法可以接收一个数组作为参数,或者只是传递给方法的许多参数。但是,我注意到它也适用于 Collections:

public static void main(String[] args) {
    Collection<Object> objects = new ArrayList<>();
    test(objects);
}

public static void test (Object...objects) {
    System.out.println("no compile errors");
}

这无需我调用toArray() 方法即可编译和运行。幕后发生了什么?这种语法是否有这种“自动转换”的其他方法?

顺便说一句,我使用的是 Java 1.7。

【问题讨论】:

    标签: java variadic-functions


    【解决方案1】:

    它不会将集合转换为数组。它将集合本身​​作为第一个 vararg 参数传递。测试方法因此接收一个元素的数组,这个元素就是ArrayList。

    这可以通过替换很容易找到

    System.out.println("no compile errors");
    

    通过

    System.out.println(Arrays.toString(objects);
    

    或者使用调试器。

    【讨论】:

      【解决方案2】:

      Collection&lt;Object&gt; 也是一个Object,所以当你调用test

      Collection<Object> objects = new ArrayList<>();
      test(objects);
      

      它将使用您的集合的单个参数调用:该方法将接收具有单个元素的数组。

      【讨论】:

        【解决方案3】:

        这里发生的情况是该方法接收到一个长度为 1 的数组,其中包含一个 Collection

        大多数时候,签名

        method(Object... objs)
        

        应该避免,因为它会接受 任何 参数序列,甚至是自动装箱的原语。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          • 2015-07-31
          • 2016-05-12
          • 1970-01-01
          相关资源
          最近更新 更多