kotlin2018. 9. 20. 11:12


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
Posted by easy16