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)
如果你不需要改变列表......
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)
您需要使用反射来实例化一个支持数组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这些都在这里使用.
最后,请注意反射比使用循环慢得多.
| 归档时间: |
|
| 查看次数: |
6865 次 |
| 最近记录: |