使用给定数量的空值初始化List <T>而没有循环?

arn*_*e.b 17 java initialization list

可以List<T>初始化为包含给定数量的nulls,其中T是列表所属类的类型参数吗?我确定可以用循环来做,但想知道是否可以没有.

List<T> myList = new ArrayList<T>(numEls);
Run Code Online (Sandbox Code Playgroud)

创建一个给定容量的列表,但是大小为0,因此myList.get(x)对所有人都失败x,例如myList.set(numEls-1,null).

myList = Arrays.asList(new T[numEls]);
Run Code Online (Sandbox Code Playgroud)

不编译,和

 myList = (List<T>) Arrays.asList(new Object[numEls]);
Run Code Online (Sandbox Code Playgroud)

在Eclipse中编译(带有未经检查的强制转换警告),但不是用javac编译.


更新:谢谢你的答案!但是,我找到了另一个很短的解决方案,接近我上面的上一次尝试,它在eclipse和我们的自动构建系统中编译:强制转换数组,而不是列表!

myList = Arrays.asList((T[]) new Object[numEls]);
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 9

如果你不需要改变列表......

List<T> result = Collections.nCopies(num, (T) null);
Run Code Online (Sandbox Code Playgroud)

... 或者交替

List<T> result = new ArrayList<T>(Collections.nCopies(num, (T) null));
Run Code Online (Sandbox Code Playgroud)


Pau*_*ora 5

您需要使用反射来实例化一个支持数组T[]使用Array.newInstance():

public static <T> List<T> getListWithNulls(Class<T> componentType, int length) {
   T[] array = (T[])Array.newInstance(componentType, length);
   return new ArrayList<T>(Arrays.asList(array));
}
Run Code Online (Sandbox Code Playgroud)

如您所见,这需要引用Class<T>表示以下类型的对象T:

List<String> strListWithNulls = getListWithNulls(String.class, 100);
Run Code Online (Sandbox Code Playgroud)

另外,请确保不要混淆类java.lang.reflect.Array,java.util.Arrays这些都在这里使用.

最后,请注意反射比使用循环慢得多.

  • @dmeister - [那个方法](http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...))返回一个由`阵列.为了获得可调整大小的列表,需要将其复制到另一个`List`实现. (2认同)