Environment
Language: Java17
Framework: SpringBoot 3.1.0
오류
constructor Jackson2JsonRedisSerializer.Jackson2JsonRedisSerializer(Class<T>) is not applicable(argument mismatch; Class<CAP#2> cannot be converted to Class<T>)
constructor Jackson2JsonRedisSerializer.Jackson2JsonRedisSerializer(JavaType) is not applicable(argument mismatch; Class<CAP#2> cannot be converted to JavaType)
where T is a type-variable:
T extends Object declared in method <T>set(String,T,long)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ? extends Object
CAP#2 extends Object from capture of ? extends Object
Jackson2JsonRedisSerializer의 생성자에서 Class<T> 타입을 요구
컴파일러가 제네릭 타입을 캡처한 결과인 CAP#2는 T 타입으로 변환할 수 없음
* CAP#1, CAP#2: 컴파일러가 제네릭 타입을 추론할 때 사용하는 임시 이름으로, T가 ? extends Object (모든 타입을 포함하는 와일드카드)로 사용될 때 부여
원인
public <T> void set(String key, T o, long milliseconds) {
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<T>(o.getClass()));
redisTemplate.opsForValue().set(key, o, milliseconds, TimeUnit.MILLISECONDS);
}
제너릭 타입(<>)에 파라미터(T)를 명시할 경우, 컴파일러가 T의 타입을 자동으로 추론할 수 없음
T의 명확한 타입을 아는 것이 아니라 단순히 와일드 카드(? extends Object)인 것만 알고 있는 상태이므로 o.getClass와 T를 매칭시키지 못함
따라서, 타입을 명시했지만 컴파일 시점에는 타입을 알 수 없어 오류 발생
해결
public <T> void set(String key, T o, long milliseconds) {
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(o.getClass()));
redisTemplate.opsForValue().set(key, o, milliseconds, TimeUnit.MILLISECONDS);
}
파라미터를 명시하지 않고 타입만 선언(<>)하여, 컴파일러에게 타입 추론 자체를 위임
🙋♀️
본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.
📑
참고 자료
Chat GPT
'Java > Java with Error' 카테고리의 다른 글
[해결 방법] error: no suitable method found for ... (0) | 2023.10.17 |
---|---|
[해결 방법] java.lang.ClassCastException (0) | 2023.08.15 |
[해결 방법] Syntax error (0) | 2023.08.09 |
[해결 방법] java.lang.Error (0) | 2023.08.09 |
[해결 방법] java.lang.Error (0) | 2023.06.06 |