
1. 에러 리포트
Error Message
- Cannot cast java.lang.Integer to java.lang.Double
과정
- HashSet<Object>을 스트림(Stream<Object>)으로 변환하고, 변환된 스트림을 Double타입의 스트림으로 변환하는 과정에서 에러 발생
원인
public String isSquared(int number) {
return factors(number).stream()
.map(Double.class::cast)
.collect(Collectors.toList())
.contains(Math.sqrt(number)) ? "squared, " : "";
}
- Stream<Object>에 Integer타입의 값이 저장되어 있는데 그걸 곧바로 Double타입으로 변환하려다 보니 에러가 발생하는거 같다.
- ClassCastException 예외가 발생한다.
해결
- 여러 해결 방법중 가장 빠르고 간단한 방법은 factors() 메서드의 반환타입을 Integer타입으로 변경하는것이 제일 빠를 거 같다.
public String isSquared(int number) {
return factors(number).stream()
.map(Integer.class::cast)
.map(Integer::doubleValue)
.collect(Collectors.toList())
.contains(Math.sqrt(number)) ? "squared, " : "";
}
- 두 번째 방법은 Stream<Object>를 Stream<Integer>로 변환하고 다시 Stream<Double>로 변환하는 방법
- Stream<Object>의 타입 변환은 저장되어있는 값의 타입과 Stream의 타입을 맞춘 다음 변환시켜야 하는 거 같다.
public String isSquared(int number) {
return factors(number).stream()
.mapToDouble(s -> Double.parseDouble(String.valueOf(s)))
.boxed()
.collect(Collectors.toList())
.contains(Math.sqrt(number)) ? "squared, " : "";
}
- 마지막 방법은 저장되어 있는 값을 String타입으로 변환하고, 그걸 Double타입으로 다시 변환해서 해결하는 방법
- 제일 처음 시도했던 방법
- 위에 3가지 방법 중에 어떤 것이 답인지는 아직 정확히는 모르겠으나, 큰 이유가 없다면 반환 타입을 Object 말고 확실하게 정해주는 것이 바람직하지 않을까 라는 생각을 한다.
'에러 리포트 > Java' 카테고리의 다른 글
[JAVA] Cannot resolve symbol 'String' (IntelliJ IDEA) (0) | 2022.01.17 |
---|