반응형
이렇게 되는 이유는 JAVA의 제네릭이 컴파일까지만 유지되고 실행단계에서는 사라져버리기 때문이다.
이번 상황은
GET 요청 URL에 JSON 포맷으로 데이터가 들어온다.
자동 파싱이 안돼서 문자열로 받고 바꾸는 작업
아래 new TypeReference<List<T>>() {} 부분이 문제다.
List도 Generic이기 때문에 List<T>가 실행단계에서는 List가 돼버린다. (타입이 없다...)
그래서 자바는 어 이게 뭐지 하고 LinkedHashMap으로 만들어서 넣음.
public void setFilter(String filter) throws Exception {
this.filter = filter;
this.setFilterList(this.<FilterItem>parseJson(this.filter));
}
private <T> List<T> parseJson(String jsonString) throws Exception{
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.readValue(jsonString, new TypeReference<List<T>>() {});
} catch (IOException e) {
throw 예외
}
}
그래서 어떻게 해야되냐.
제네릭이 중첩되는 경우 T를 넣으면 안된다. 타입을 명시해줘야된다. (내생각)
그럴려면? 밖에서 타입을 적어서 만든걸 전달해주기로 했다.
public void setFilter(String filter) throws Exception {
this.filter = filter;
this.setFilterList(this.parseJson(this.filter, new TypeReference<List<FilterItem>>() {}));
}
private <T> List<T> parseJson(String jsonString, TypeReference<List<T>> type) throws Exception{
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.readValue(jsonString, type);
} catch (IOException e) {
throw 예외
}
}
컴파일할때는 에러도 안나고
런타임중에 foreach문 돌렸는데 터져서 알게됐다.
원래 자바에 제네릭이 반쪽 제네릭이라 사라지는건 알았는데 참 이상한일이다. 왜저렇게 해놨지...
반응형
'백엔드 > Java' 카테고리의 다른 글
멀티스레드 처리 (0) | 2020.12.07 |
---|---|
JSON Enum 파싱 (0) | 2020.11.10 |
문자열 배열을 문자열로 변환할 때 구분자 처리 (0) | 2020.09.26 |
[JAVA] String to Date, Date to String 형변환 (0) | 2020.08.06 |
JVM이 이용가능한 프로세스 개수 (0) | 2020.03.17 |
댓글