IT

Kotlin의 키워드는 어떻게 작동하나요?

lottoking 2020. 8. 31. 08:04
반응형

Kotlin의 키워드는 어떻게 작동하나요?


나는 reified키워드 의 목적을 이해하려고 노력하고 있는데 , 분명히 우리가 제네릭에 대한 반성을 할 수있게 .

그러나 내가 제외하면 잘 작동합니다. 누구든지 실제 실제 차이 만들 때 설명 할 관심이 있습니까?


TL; DR : reified장점

fun <T> myGenericFun(c: Class<T>) 

와 같은 제네릭 함수의 본문에서는 타임에만 사용할 수 있기 때문에 가동 에는 지워 지기 때문에 myGenericFun액세스 할 수 없습니다 . 제네릭 유형을 따라서 함수 본문에서 또는 일반 클래스로 사용하려면에 표시된대로 클래스를 매개 변수명시 적으로 전달 해야 우리합니다 .TmyGenericFun

그러나 구체화inline함수 를 생성하면 런타임에서도 유형에 액세스 할 수 있으므로 추가 로 전달할 필요가 없습니다 . 일반 클래스 인 것처럼 작업 할 수 있습니다 . 예를 들어 변수가의 인스턴스 인지 확인하고 싶을 수 있습니다 . 쉽게 쉽게 수행 할 수 있습니다 .. TTClass<T>T TmyVar is T

유형 있는 단 함수 는 다음과 가변적 입니다.inlinereifiedT

inline fun <reified T> myGenericFun()

어떻게 reified작동

기능reified 과 조합해서 만 사용할 수 있습니다 . 함수는 컴파일러 이러한 가 함수가 사용되는 모든 위치에 함수의 바이트 코드복사하도록합니다 (함수가 "인라인"됨). 수정 된 유형으로 인라인 함수를 호출하면 컴파일러는 유형 인수로 사용되는 실제 유형을 알고 생성 된 바이트 코드를 수정하여 해당 클래스를 직접 사용합니다. 따라서 호출 같은 된다 (유형 인수가 있다면 ) 바이트 코드와 런타임에.inlinemyVar is TmyVar is StringString


얼마나 도움 reified이 될 수 있는지 예를 생생하게 보겠습니다 . JSON 패키지를 함수의 제네릭 유형으로 지정된 유형을 사용하여 일반 Kotlin 클래스로 변환 하려는 목적 String대한 확장 함수를 만들고 싶습니다 . 이를 위해 사용할 수있는 첫 번째 접근 방식은 다음과 같습니다.toKotlinObjectTcom.fasterxml.jackson.module.kotlin

a) 수정 된 유형이없는 첫 번째 접근

fun <T> String.toKotlinObject(): T {
      val mapper = jacksonObjectMapper()
                                                        //does not compile!
      return mapper.readValue(this, T::class.java)
}

이 방법은 readValue파싱해야하는 유형을 사용합니다 JsonObject. Class유형 변수 매개 변수 를 얻으려고 T하면 컴파일러는 "수정 된 유형 매개 변수로 'T'를 사용할 수 있습니다. 대신 클래스를 사용 합니다. "라고 불평 합니다.

b) 명시 적 Class매개 변수를 해결 방법

fun <T: Any> String.toKotlinObject(c: KClass<T>): T {
    val mapper = jacksonObjectMapper()
    return mapper.readValue(this, c.java)
}

해결 방법으로 ClassT를 메서드 매개 변수로 만든 다음에, 대한 인수로 사용할 수 readValue있습니다. 이 작동하며 일반 Java 코드의 일반적인 패턴입니다. 다음과 같이 호출 할 수 있습니다.

data class MyJsonType(val name: String)

val json = """{"name":"example"}"""
json.toKotlinObject(MyJsonType::class)

c) Kotlin 방식 : reified

유형 변수 inline와 함께 함수를 사용하면 함수를 다르게 구현할 수 있습니다.reifiedT

inline fun <reified T: Any> String.toKotlinObject(): T {
    val mapper = jacksonObjectMapper()
    return mapper.readValue(this, T::class.java)
}

테이크 할 필요가 없습니다 ClassT추가, T그것은 일반 클래스 인 것처럼 사용할 수 있습니다. 클라이언트의 경우 코드는 다음과 가변적입니다.

json.toKotlinObject<MyJsonType>()

중요 참고 : Java 작업

reified유형이 있는 인라인 함수 는 Java 코드 에서 호출 할 수 없습니다 .

참고 URL : https://stackoverflow.com/questions/45949584/how-does-the-reified-keyword-in-kotlin-work

반응형