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(这就是为什么这让我感到困惑)...
有人知道魔法是如何运作的吗?
谢谢!
ArrayList这里描述的类型不是java.util.ArrayList; 它是在该文件中定义的私有类型(参见第3799行).那个确实有一个数组构造函数,它是引用的那个Arrays.asList.
希望这可以帮助!