Cannot check for instance of erased type: T 오류는 왜 발생할까?
JVM은 제네릭 타입을 실행 시점에 지원하지 않기 때문에, 자바의 제네릭과 마찬가지로 코틀린의 제네릭 또한 컴파일 타입에 타입 지워짐(Type Erasure)이 발생한다. 이 때문에 제네릭을 사용하는 일반 함수에서는 함수 본문에서 제네릭 타입을 이용해 연산을 할 수 없다. 예를 들어 다음과 isType 함수를 살펴 보자.
fun <T> isType(value: Any): Boolean {
return value is T
}
이 함수는 겉보기에는 문제가 없어 보인다. 하지만, T라는 타입은 컴파일 시점에 지워지고, 실행 시점에는 T가 무슨 타입인지 알 수 없기 때문에 다음과 같은 오류가 발생한다.
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)
}
그러면 다음과 같이 코드의 실행이 성공하는 것을 확인할 수 있다.
반응형