java.util.Arrays.asList(T ...)如何工作?

Siu*_*ji- 5 java arrays collections arraylist variadic-functions

这看起来似乎是一个愚蠢的问题,但我发现这个机制并非微不足道.从实现JDK 8(从复制这里)是短短的几行:

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
Run Code Online (Sandbox Code Playgroud)

关键在于:只有3个构造函数ArrayList:

  • 一个不带任何参数
  • 一个需要int(初始容量)
  • 一个采取Collection如下所示的(元素)(从这里复制):

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{

    // ...

    transient Object[] elementData; // non-private to simplify nested class access

    private int size;

    // ...

    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);

    }

    // ...

}
Run Code Online (Sandbox Code Playgroud)

由于唯一的可能性是调用第3个构造函数,似乎参数a(通用vararg)以某种方式"转换"为a Collection.但据我所知,varargs只不过是语法较短的数组,并且不能转换为Collections(这就是为什么这让我感到困惑)...

有人知道魔法是如何运作的吗?

谢谢!

Sot*_*lis 12

你看错了ArrayList班级.使用的那个Arrays.asList(..)java.util.Arrays.ArrayList并且有一个接受数组的构造函数.


tem*_*def 5

ArrayList这里描述的类型不是java.util.ArrayList; 它是在该文件中定义的私有类型(参见第3799行).那个确实有一个数组构造函数,它是引用的那个Arrays.asList.

希望这可以帮助!