8

我在我的代码中使用 Arrays.asList().contains() 方法,如最佳答案所示:如何测试数组是否包含某个值?,所以我将在代码中使用 Arrays.asList() 。

但是,编译器拒绝以下代码。是因为我的素数数组使用了原语,而不是引用类型吗?由于自动装箱,我不这么认为,但我只是想检查一下。

import java.math.*;
import java.util.ArrayList;
import java.util.Arrays;

public class .... {
    public static void main(String[] args) {
        int[] primes = formPrimes(15);
        ArrayList<Integer> primes1 = new ArrayList<Integer>(Arrays.asList(primes));
        // Rest of code...
    }

    public static int[] formPrimes(int n) {
        // Code that returns an array of integers
    }
}

我收到一个错误,一个找不到符号错误。

符号:构造函数 ArrayList(java.util.List)

位置:类 java.util.ArrayList ArrayList primes1 = new ArrayList(Arrays.asList(primes));

基本上,我有一个返回整数数组的函数,我想将其转换为数组列表,但在使用 ArrayList 构造函数时遇到了麻烦。

4

3 回答 3

10

是的。自动装箱不适用于数组,仅适用于基元。

我在 Eclipse 中遇到的错误是 The constructor ArrayList<Integer>(List<int[]>) is undefined

那是因为 ArrayList 中的构造函数定义为public ArrayList(Collection<? extends E> c). 如您所见,它只接受 Collection 的子类型,而 int 不接受。

只需将您的代码更改为:

public class .... {
    public static void main(String[] args) {
        Integer[] primes = formPrimes(15);
        ArrayList<Integer> primes1 = new ArrayList<Integer>(Arrays.asList(primes));
        // Rest of code...
    }

    public static Integer[] formPrimes(int n) {
        // Code that returns an array of integers
    }
}

一切都应该很好,假设您从fromPrimes.

从 Andrew 的评论中更新 ,并在查看 Arrays.asList 的源代码后:

public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
}

所以这里真正发生的是它Arrays.asList(new int[] {})实际上会返回 a List<int[]>,而不像Arrays.asList(new Integer[] {})which 会返回 a List<Integer>。显然 ArrayList 构造函数不会接受 a List<int[]>,因此编译器会抱怨。

于 2012-06-01T23:21:46.957 回答
1

primes是原始int类型的数组;该类型不是派生自Object,因此可以自动放入 a List(与所有 一样Collections,只能包含Objects)。@贾斯汀是对的;您需要手动将数组中的项目添加到列表中。

于 2012-06-01T23:34:57.253 回答
0

如果您这样做是为了访问 contains 方法,您不妨编写自己的方法。

public boolean contains(int[] array, int item) {
  for (int element: array)
    if (element == item)
      return true;

  return false;
}
于 2012-06-02T00:15:25.900 回答