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
'source' 카테고리의 다른 글
| 지원되지 않음Instant to String 포맷 시 TemporalTypeException (0) | 2022.11.11 |
|---|---|
| mysqldump 오류: max_allowed_packet'보다 큰 패킷을 받았습니다. (0) | 2022.11.11 |
| Angular 변수에서 iframe src 속성을 설정하는 방법JS (0) | 2022.11.02 |
| x64 Java에서 int보다 긴 이유는 무엇입니까? (0) | 2022.11.02 |
| 정수를 int로 변환하는 방법 (0) | 2022.11.02 |