java.lang.ClassCastException: class [I cannot be cast to class java.lang.Integer ([I and java.lang.Integer are in module java.base of loader 'bootstrap')
at line 19, Solution.generate
at line 54, DriverSolution.helper
at line 84, Driver.main
리트 코드 문제를 풀던 중
오류가 발생해 버렸다.
원문의 코드
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ans = new ArrayList<>();
if (numRows >= 2) {
ans.add(new ArrayList(Arrays.asList(1)));
ans.add(new ArrayList(Arrays.asList(1, 1)));
} else if (numRows >= 1) {
ans.add(new ArrayList(Arrays.asList(1)));
}
for (int i = 3; i <= numRows; i++) {
int[] nums = new int[i]; // 선언부 int[]
nums[0] = 1;
nums[nums.length - 1] = 1;
List<Integer> prev = ans.get(i - 2); // 선언부 prev
for (int j = 0; j < i - 2; j++) {
nums[j + 1] = prev.get(j); // 오류가 발생한 지점
List<Integer> row = new ArrayList(Arrays.asList(nums));
ans.add(row);
}
}
return ans;
}
}
Integer 를 제너릭으로 하는 리스트의 아이템을, int 배열에 넣는데 왜 오류가 발생하는 것일 까 라는 의문이 생겼다.
나는 자동으로 wrapper class 의 boxing, unboxing 개념이 적용 될 줄 알았지만, 그렇지 않은 것이 에러의 원인 이었다.
따라서 해당 오류 나는 코드를 바꾸기 위해서 위 코드의 선언부의 배열 타입을 아래와 같이 바꾼 것으로 오류를 해결하였다.
Integer[] nums = new Integer[i];
또한, Arrays.asList 메서드가 int 형태를 자동으로 Integer 타입으로 boxing 해주지 않는다고 한다.
아래는 비슷한 고민의 stackoverflow 의 답변
asList 는 boxing 을 지원하지 않는 다고 말하고 있다.
링크텍스트