Kotlin의 키워드는 어떻게 작동하나요?
나는 reified
키워드 의 목적을 이해하려고 노력하고 있는데 , 분명히 우리가 제네릭에 대한 반성을 할 수있게 .
그러나 내가 제외하면 잘 작동합니다. 누구든지 실제 실제 차이 를 만들 때 설명 할 관심이 있습니까?
TL; DR : reified
장점
fun <T> myGenericFun(c: Class<T>)
와 같은 제네릭 함수의 본문에서는 타임에만 사용할 수 있기 때문에 가동 에는 지워 지기 때문에 myGenericFun
액세스 할 수 없습니다 . 제네릭 유형을 따라서 함수 본문에서 또는 일반 클래스로 사용하려면에 표시된대로 클래스를 매개 변수 로 명시 적으로 전달 해야 우리합니다 .T
myGenericFun
그러나 구체화 로 inline
함수 를 생성하면 런타임에서도 유형에 액세스 할 수 있으므로 추가 로 전달할 필요가 없습니다 . 일반 클래스 인 것처럼 작업 할 수 있습니다 . 예를 들어 변수가의 인스턴스 인지 확인하고 싶을 수 있습니다 . 쉽게 쉽게 수행 할 수 있습니다 .. T
T
Class<T>
T
T
myVar is T
유형 이 있는 단 함수 는 다음과 가변적 입니다.inline
reified
T
inline fun <reified T> myGenericFun()
어떻게 reified
작동
기능reified
과 조합해서 만 사용할 수 있습니다 . 함수는 컴파일러 이러한 가 함수가 사용되는 모든 위치에 함수의 바이트 코드 를 복사하도록합니다 (함수가 "인라인"됨). 수정 된 유형으로 인라인 함수를 호출하면 컴파일러는 유형 인수로 사용되는 실제 유형을 알고 생성 된 바이트 코드를 수정하여 해당 클래스를 직접 사용합니다. 따라서 호출 같은 된다 (유형 인수가 있다면 ) 바이트 코드와 런타임에.inline
myVar is T
myVar is String
String
예
얼마나 도움 reified
이 될 수 있는지 예를 생생하게 보겠습니다 . JSON 패키지를 함수의 제네릭 유형으로 지정된 유형을 사용하여 일반 Kotlin 클래스로 변환 하려는 목적 String
에 대한 확장 함수를 만들고 싶습니다 . 이를 위해 사용할 수있는 첫 번째 접근 방식은 다음과 같습니다.toKotlinObject
T
com.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)
}
해결 방법으로 Class
의 T
를 메서드 매개 변수로 만든 다음에, 대한 인수로 사용할 수 readValue
있습니다. 이 작동하며 일반 Java 코드의 일반적인 패턴입니다. 다음과 같이 호출 할 수 있습니다.
data class MyJsonType(val name: String)
val json = """{"name":"example"}"""
json.toKotlinObject(MyJsonType::class)
c) Kotlin 방식 : reified
유형 변수 inline
와 함께 함수를 사용하면 함수를 다르게 구현할 수 있습니다.reified
T
inline fun <reified T: Any> String.toKotlinObject(): T {
val mapper = jacksonObjectMapper()
return mapper.readValue(this, T::class.java)
}
테이크 할 필요가 없습니다 Class
의 T
추가, T
그것은 일반 클래스 인 것처럼 사용할 수 있습니다. 클라이언트의 경우 코드는 다음과 가변적입니다.
json.toKotlinObject<MyJsonType>()
중요 참고 : Java 작업
reified
유형이 있는 인라인 함수 는 Java 코드 에서 호출 할 수 없습니다 .
참고 URL : https://stackoverflow.com/questions/45949584/how-does-the-reified-keyword-in-kotlin-work
'IT' 카테고리의 다른 글
다중 바인딩에서 1 바인딩에 대한 상수 값을 어떻게합니까? (0) | 2020.08.31 |
---|---|
selectMatch에서 각도 ui-bootstrap typeahead 복수? (0) | 2020.08.31 |
첫 번째 문자를 소문자로 만드는 가장 방법은 무엇입니까? (0) | 2020.08.31 |
클래스의 인스턴스 메서드 목록 가져 오기 (0) | 2020.08.31 |
JSON.Net 자체 참조 루프 감지 (0) | 2020.08.31 |