fun <T> TreeNode.findParentOfType(clazz: Class<T>): T? {
var p = parent
while (p != null && !clazz.isInstance(p)) {
p = p?.parent
}
@Suppress("UNCHECKED_CAST")
return p as T
}
위 함수는 노드가 특정 타입을 가졌는지 확인하기 위해 트리를 탐색하고 리플렉션을 사용하는 코드이다. 위 함수를 호출할 때 다음과 같이 호출할 것이다.
findParentOfType(SomeClass::class.java)
inline fun <reified T> TreeNode.findParentOfType(): T? {
var p = parent
while (p != null && p !is T) {
p = p?.parent
}
return p as T
}
위와 같이 인라인 함수를 정의하였다면 findParentOfType<SomeClass>() 이렇게 호출할 수 있다.
타입 파라미터에 reified를 정의하면 마치 클래스처럼 타입 파라미터에 접근할 수 있다.
인라인 함수이므로 리플렉션이 필요 없고 is나 as와 같은 일반 연산자가 동작한다.
참고로 인라인이 아닌 일반 함수에는 reified를 사용할 수 없다.
결론 :
inline 함수에서 reified를 사용하면 아래와 같이 함수호출을 간결하게 바꿀 수 있다.
findParentOfType(SomeClass::class.java) -> findParentOfType<SomeClass>()
출처 :
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-
%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be
'kotlin' 카테고리의 다른 글
kotlin java class object 얻기 (0) | 2019.07.30 |
---|---|
dagger (0) | 2018.09.20 |
in/out keywords (0) | 2018.09.20 |
First Class Function (0) | 2018.08.31 |
kotlin 관한 글 (link) (0) | 2018.08.22 |