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
복사했습니다!