엄범

 

원래 그 데이터 타입으로는 캐스팅 가능

```kt

@Test
fun `테스트`() {

    val obj: Object = Coffee("id", "name") as Object
    val coffee: Coffee = obj as Coffee

    // 이건 원래 그 데이터가 Coffee라서 가능

 

    val obj2: Object = Object()
    val coffee2: Coffee = obj2 as Coffee

    // 이건 불가능. id 속성이랑 name 속성이 없으니까 당연 불가능하다

}

```

 

RestTemplate의 Object -> T type casting 과정

  • RestTemplate도 내부적으로는 `` (T)`` 캐스팅을 이용하게 되는데
  • ``kt extractData()``에서 비검사 형변환 경고를 제어하기 위해 ``kt @SuppressWarnings``로 경고를 억제해준다.

```java

@SuppressWarnings({"unchecked", "rawtypes", "resource"})
public T extractData(ClientHttpResponse response) throws IOException {

    ...

    return (T) genericMessageConverter.read(this.responseType, null, responseWrapper);

```

  • genericMessageConverter는 인터페이스
  • jackson을 사용시 MappingJackson2HttpMessageConverter를 구현체로 사용하게 됨
    • jackson은 ``kt ObjectMapper.read()``를 이용하게 됨.
    • ObjectMapper.read() 와 그 안의 메서드를 실행하면서 type 정보가 일치하는지 보는 것 같다
      • Type 별로 다른 Deserializer를 사용하는 것 같은데 ``kt findRootDeserializer()`` 같은 메서드를 호출하는걸로 봐서는 context 상에서 Deserializer를 찾고, 없으면 새로 만드는 듯.