Arrays.asList(T[] array)?

8
所以有一个Arrays.asList(T... a),但这只适用于可变参数。
如果我已经有了T[] a数组呢?是否有便利方法将其创建为List<T>,或者我必须手动完成如下操作:
static public <T> List<T> arrayAsList(T[] a)
{
   List<T> result = new ArrayList<T>(a.length);
   for (T t : a)
     result.add(t);
   return result;
}
2个回答

17
只是因为它可以使用可变参数不代表你不能正常调用它:
String[] x = { "a", "b", "c" };
List<String> list = Arrays.asList(x);

唯一需要注意的是,如果TObject,那么您需要使用强制转换来告诉编译器它是否应该将参数包装在数组中:

Object[] x = ...;
List<Object> list = Arrays.asList((Object[]) x);

或者

Object[] x = ...;
List<Object[]> list = Arrays.asList((Object) x);

进一步澄清,据我所知,这是因为对于编译器而言,可变参数和数组是等效的,因此任何时候只要你看到可变参数,就可以使用相同类型的数组。 - Gnat
奇怪!我一直以为可变参数函数只能在将参数收集为数组的模式下调用。 - Jason S
@JasonS 不,数组表示法可以完全与可变参数表示法交换使用。你甚至可以创建一个带有 public static void main(String... args){} 的主类。 - Timmos

0

正如您可能已经知道的那样,有一个名为java.util.Collections的静态类,它具有许多有用的方法来处理数组,例如搜索和排序。

至于您的问题,Collection接口指定了addremovetoArray等方法。由于某种原因,API的作者决定addaddAll方法将是提供给用户的唯一输入函数。

Java列表不能添加对象数组的一个解释是,列表使用迭代器,而迭代器在滚动(即转到下一个值)时更加严格,而数组则不必拥有所有索引值(i=(1、2、5、9、22、...))

此外,数组不是类型安全的;也就是说,它们无法保证所有元素都符合特定的超类或接口,而泛型(其中List是成员之一)可以保证类型安全。因此,列表有机会使用add方法验证每个项目。

我认为您可以放心,将数组添加到列表的方法是在Java中实现此效果最有效的方法之一(如果不是最有效的方法)。


我不确定你正在回答什么问题,但那不是我问的问题。 - Jason S
第一段不相关,第二段是关于“Collection”和“List”接口的背景信息。第三和第四段解释了为什么没有更直接的方法(与您的方法相反)来从数组创建“List<T>”。我希望这有助于澄清我的答案。 - Sinker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接