初始化 List<T>,使用给定数量的 null 而不带循环?

2022-09-01 23:26:32

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

List<T> myList = new ArrayList<T>(numEls);

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

myList = Arrays.asList(new T[numEls]);

不编译,并且

 myList = (List<T>) Arrays.asList(new Object[numEls]);

在 Eclipse 中编译(带有“未选中强制转换”警告),但不能使用 javac。


更新:感谢您的回答!但是,我发现了另一个非常短的解决方案,接近我上面的最后一次尝试,它可以在eclipse和我们的自动构建系统中编译:Cast数组,而不是列表!

myList = Arrays.asList((T[]) new Object[numEls]);

答案 1

如果您不需要更改列表...

List<T> result = Collections.nCopies(num, (T) null);

...或交替

List<T> result = new ArrayList<T>(Collections.nCopies(num, (T) null));

答案 2

您需要使用反射来实例化使用 Array.newInstance() 的后备数组:T[]

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));
}

如您所见,这需要引用表示类型:Class<T>T

List<String> strListWithNulls = getListWithNulls(String.class, 100);

还要确保不要混淆类和此处使用的类。java.lang.reflect.Arrayjava.util.Arrays

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