2013-10-09 3 views
1

У меня есть следующий код:Автобоксинг не работает?

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 является целочисленным массивом {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 

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

ответ

4

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

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

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

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

Примитивы являются автобоксами, но массивов нет. Это будет работать, если вы измените ИНТ [] s в Integer [] s

+1

Но посмотрите на этот пример. http://stackoverflow.com/a/6171675/2288418 Он передает массив int в asList и может получить его индекс. EDIT: Nevermind, в его примере LOL произошла ошибка. –

Смежные вопросы