source

Java 선택 안 함: varargs 파라미터에 대한 일반 배열 작성 선택 안 함

itover 2022. 11. 11. 23:28
반응형

Java 선택 안 함: varargs 파라미터에 대한 일반 배열 작성 선택 안 함

Java 코드에서 체크되지 않은 경고를 표시하도록 Netbeans를 설정했지만 다음 행의 오류를 이해하지 못했습니다.

private List<String> cocNumbers;
private List<String> vatNumbers;
private List<String> ibans;
private List<String> banks;
...
List<List<String>> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans);

제공 내용:

[unchecked] unchecked generic array creation for varargs parameter of type List<String>[]

메서드 소스:

/**
 * Returns a list of all possible combinations of the entered array of lists.
 *
 * Example: [["A", "B"], ["0", "1", "2"]]
 * Returns: [["A", "0"], ["A", "1"], ["A", "2"], ["B", "0"], ["B", "1"], ["B", "2"]]
 *
 * @param <T> The type parameter
 * @param elements An array of lists
 * @return All possible combinations of the entered lists
 */
public static <T> List<List<T>> createCombinations(List<T>... elements) {
    List<List<T>> returnLists = new ArrayList<>();

    int[] indices = new int[elements.length];
    for (int i = 0; i < indices.length; i++) {
        indices[i] = 0;
    }

    returnLists.add(generateCombination(indices, elements));
    while (returnLists.size() < countCombinations(elements)) {
        gotoNextIndex(indices, elements);
        returnLists.add(generateCombination(indices, elements));
    }

    return returnLists;
}

코드에 체크 마크가 없는 경고는 좋지 않을 것 같기 때문에 정확히 어떤 문제가 발생하고 있으며 어떻게 수정해야 합니까?

말씀드리는 것을 잊었습니다만, 저는 Java 7을 사용하고 있습니다.

Edit(편집): 메서드에 다음 항목이 있습니다.

[unchecked] Possible heap pollution from parameterized vararg type List<T>
  where T is a type-variable:
    T extends Object declared in method <T>createCombinations(List<T>...)

앞서 말한 janoh.janoh에서 설명한 바와 같이 Java의 vararargs는 어레이에 대한 구문설탕에 콜링 사이트에서 어레이를 암묵적으로 작성하는 것에 불과합니다.그렇게

List<List<String>> combinations =
    Utils.createCombinations(cocNumbers, vatNumbers, ibans);

사실

List<List<String>> combinations =
    Utils.createCombinations(new List<String>[]{cocNumbers, vatNumbers, ibans});

하지만 아시다시피new List<String>[]Java에서는 다른 많은 질문에서 다루어진 이유로 허용되지 않지만 주로 실행 시 어레이가 자신의 컴포넌트 유형을 알고 있으며 추가된 요소가 해당 컴포넌트 유형과 일치하는지 여부를 런타임에 확인해야 하지만 파라미터화된 유형에서는 이 체크가 불가능합니다.

어쨌든 컴파일러는 실패하지 않고 어레이를 만듭니다.다음과 같은 작업을 수행합니다.

List<List<String>> combinations =
    Utils.createCombinations((List<String>[])new List<?>[]{cocNumbers, vatNumbers, ibans});

이것은 잠재적으로 안전하지 않지만 반드시 안전하지 않은 것은 아닙니다.대부분의 varargs 메서드는 단순히 varargs 요소를 반복하여 읽습니다.이 경우 어레이의 런타임 유형은 중요하지 않습니다.이것이 당신의 방법에 해당됩니다.Java 7에 있기 때문에@SafeVarargs이 경고는 더 이상 표시되지 않습니다.이 주석에는 기본적으로 이 방법은 배열 유형이 아니라 요소의 유형에만 관심이 있다고 나와 있습니다.

그러나 배열의 런타임 유형을 사용하는 몇 가지 varargs 메서드가 있습니다.이 경우 안전하지 않을 수 있습니다.그래서 경고가 있는 거야

Java 컴파일러는 varargs에 암묵적인 배열 생성을 사용하고 Java는 일반적인 배열 생성을 허용하지 않기 때문입니다(type 인수는 다시 만들 수 없기 때문입니다).

다음 코드는 올바르므로(이러한 작업은 어레이에서 허용됨), 선택되지 않은 경고가 필요합니다.

public static <T> List<List<T>> createCombinations(List<T> ... lists) {
    ((Object[]) lists)[0] = new ArrayList<Integer>();
    // place your code here
}

자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/21132692/java-unchecked-unchecked-generic-array-creation-for-varargs-parameter

반응형