[Kotlin] 제네릭 사용 시 Cannot check for instance of erased type: T 오류 해결 방법 : inline과 reified를 사용한 문제 해결

2024. 4. 3. 07:27· Kotlin/Variable and Function
목차
  1. Cannot check for instance of erased type: T 오류는 왜 발생할까?
  2. inline fun과 reified를 사용한 문제 해결
반응형

Cannot check for instance of erased type: T 오류는 왜 발생할까?

JVM은 제네릭 타입을 실행 시점에 지원하지 않기 때문에, 자바의 제네릭과 마찬가지로 코틀린의 제네릭 또한 컴파일 타입에 타입 지워짐(Type Erasure)이 발생한다. 이 때문에 제네릭을 사용하는 일반 함수에서는 함수 본문에서 제네릭 타입을 이용해 연산을 할 수 없다. 예를 들어 다음과 isType 함수를 살펴 보자.

fun <T> isType(value: Any): Boolean {
  return value is T
}

 

이 함수는 겉보기에는 문제가 없어 보인다. 하지만, T라는 타입은 컴파일 시점에 지워지고, 실행 시점에는 T가 무슨 타입인지 알 수 없기 때문에 다음과 같은 오류가 발생한다.

그림1. 제네릭 타입 오류

 

Cannot check for instance of erased type: T
지워진 타입 T의 인스턴스를 확인할 수 없습니다.

 

그렇다면 이 문제를 해결하기 위해서는 어떻게 해야할까?

 

inline fun과 reified를 사용한 문제 해결

이 문제를 해결하기 위해서는 실행 시점에 제네릭 타입 정보를 유지해야 한다. 이를 위해서는 제네릭 타입을 구체 타입(reified)으로 선언하고 함수를 inline 함수로 선언해 런타임에 타입 정보에 접근할 수 있도록 해야 한다. 즉, 위의 코드를 다음과 같이 바꾸면 된다.

inline fun <reified T> isType(value: Any): Boolean {
  return value is T
}

 

그러면 이제 오류가 사라지는 것을 확인할 수 있다.

 

위 코드가 잘 동작하는지 확인하기 위해 다음 코드를 실행해보자.

fun main() {
  val string = "Test String"
  val isString = isType<String>(string)
  println(isString)
}

 

그러면 다음과 같이 코드의 실행이 성공하는 것을 확인할 수 있다.

그림2. 실행 성공

 

 

반응형
저작자표시 비영리 변경금지
  1. Cannot check for instance of erased type: T 오류는 왜 발생할까?
  2. inline fun과 reified를 사용한 문제 해결


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Kotlin/Variable and Function' 카테고리의 다른 글
  • [Kotlin] inline fun 함수를 사용한 고차 함수 최적화
  • [Kotlin] operator fun 을 통한 연산자 오버로딩 한번에 정리하기
  • [Kotlin] lateinit var 사용법 한 번에 정리하기
  • [Kotlin] var과 val의 차이는 무엇인가?
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • GraphQL
  • gradle
  • 코틀린
  • Class
  • GIT
  • github
  • flow
  • Coroutine
  • Spring boot
  • Dependency Injection
  • junit5
  • junit
  • Spring
  • 코루틴
  • java
  • kotlin spring
  • junit4
  • github actions
  • dagger2
  • compose
  • 안드로이드
  • Android Compose
  • Kotlin
  • 의존성 주입
  • Android
  • 유닛 테스팅
  • Unit Testing
  • Jetpack Compose
  • HTTP
  • 스프링

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[Kotlin] 제네릭 사용 시 Cannot check for instance of erased type: T 오류 해결 방법 : inline과 reified를 사용한 문제 해결
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.