Автобокс не работает?

У меня есть следующий код:

static boolean nextPerm(int[] A) {
        int N = A.length;
        int k = N - 1;
        int[] S = { };
        while (k >= 0) {
            if (S.length > 0 && containsLarger(S, A[k])) {
                int v = firstLargest(S, A[k]);
                //int vIndex = Arrays.asList(S).indexOf(v);
                List<Integer> test = Arrays.asList(S); // // ERRORS HERE. Before error, S is { 2 } 
                System.out.println(test.get(0)); 
                int vIndex = test.indexOf(S);
                S[vIndex] = A[k];
                A[k] = v;
                System.arraycopy(S, 0, A, k + 1, N - k);
                return true;
            } else {
                S = addIntAscend(S, A[k]);
                k -= 1;
            }
        }
        return false;
    }

Перед ошибкой S является массивом int { 2 }. Это ошибки, когда я устанавливаю TEST в Arrays.asList(S):

Perms.java:44: error: incompatible types
                List<Integer> test = Arrays.asList(S);
                                                  ^
  required: List<Integer>
  found:    List<int[]>
1 error

Почему это происходит? Я думал, что примитивы были автоматически упакованы?

2 ответа

Решение

Посмотрите на этот отчет об ошибке, который был закрыт как Not an Issue ссылаясь на причину ниже.

Автобокс целых массивов не определено поведение, по уважительной причине. Это может быть слишком дорого для больших массивов.

Поэтому, чтобы преобразовать ваш массив в список, вам нужно сделать это

List<Integer> test = new ArrayList<Integer>(S.length);
for (int i : S) {
    test.add(i);
}

Примитивы автоматически упакованы, а массивы - нет. Это будет работать, если вы измените свои int[] на Integer[]

Другие вопросы по тегам