代码之家  ›  专栏  ›  技术社区  ›  Leon Helmsley

自动装箱不起作用?[副本]

  •  1
  • Leon Helmsley  · 技术社区  · 11 年前

    我有以下代码:

    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 回复  |  直到 11 年前
        1
  •  4
  •   Rahul    11 年前

    看看这个 bug report 它被关闭为 Not an Issue 理由如下。

    整个阵列的自动装箱不是指定的行为,当然 原因对于大型阵列来说,它可能非常昂贵。

    因此,要将数组转换为列表,您需要这样做

    List<Integer> test = new ArrayList<Integer>(S.length);
    for (int i : S) {
        test.add(i);
    }
    
        2
  •  3
  •   Alowaniak    11 年前

    基本体是自动装箱的,但数组不是。 如果您将int[]更改为Integer[],它将起作用