오늘의하루

Type safety: Unchecked cast from ~ 본문

JAVA

Type safety: Unchecked cast from ~

오늘의하루_master 2024. 2. 16. 13:50

발생원인

Object 타입으로 받아온 값을 List<Test>로 형변환을 시도하던 중 발생하였다.

이는 타입 안전성(Type safety)은 컴파일 중에 타입 제약 조건을 강제하여 런타임 중에 타입 오류를 방지하는 것을 의미하여 예외가 아닌 경고이다.

해결방법

  • SuppressWarnings 어노테이션 붙이기
    • SuppressWarnings 관련 옵션은 링크에서 확인 가능합니다.
@Getter
public class Tistory{
    Object data;
}

@SuppressWarnings("unchecked")
List<Test> vo = (ArrayList<Test>) tistory.getData();
  • 개발자 답게 타입을 정확히 확인하고 형변환 하기
    • 항상 타입을 정확히 하는 것이 좋아 보인다.
@Getter
public class Tistory{
    Object data;
}

List<Test> list = new ArrayList<>();

if(tistory.getData() instanceof ArrayList<?>){
    for(Object obj : (ArrayList<?>)tistory.getData()){
        if(obj instanceof LinkedHashMap){
            list.add(convertObjToType(LinkedHashMap<?,?> obj, Test.class));
        }
    }
}

	private <T> T convertObjToClassType(LinkedHashMap<?, ?> map, Class<T> clazz) {
		try {
			Constructor<T> constructor = clazz.getConstructor();
			T clazzInstance = constructor.newInstance();
			
			for (Map.Entry<?, ?> entry : map.entrySet()) {
				String key = (String) entry.getKey();
				Object value = entry.getValue();
				try {
					Field field = clazz.getDeclaredField(key);
					field.setAccessible(true); // 필드 접근을 활성화합니다.
					field.set(clazzInstance, value); // 필드에 값을 설정합니다.
				} catch (NoSuchFieldException e) {
					e.printStackTrace();
				}
			}
			return clazzInstance;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

 

Comments