Kotlin动态功能中有多少个参数?

时间:2019-05-08 04:12:59

标签: android kotlin

我正在尝试编写一个带有动态闭包/函数的函数

router.intercept("users/:userId") { (userId: Int) ->
   print("User id is $userId")
}

router.intercept("users/:userId/albums/:albumName") { (userId: Int, albumName: String) ->
   print("User id is $usrrId, album is $albumName")
}

通过使用命名的元组可以迅速做到这一点,可以用kotlin来实现吗?

  • 我希望命名变量
  • 我希望能够支持n个参数

1 个答案:

答案 0 :(得分:0)

一般可以将intercept重载n次,并使用lambda定义来推断类型:

fun <T1> intercept(path: String, cb: (T1) -> Unit) = ...
fun <T1, T2> intercept(path: String, cb: (T1, T2) -> Unit) = ...
fun <T1, T2, T3> intercept(path: String, cb: (T1, T2, T3) -> Unit) = ...

router.intercept("users/:userId/albums/:albumName") { userId: Int, albumName: String -> }

但是对于intercept,所有参数看起来都像Any?,并且您可能不会获得有关用lambda声明的名称或类型的任何信息,并且使用错误的类型将导致异常。 / p>

要充分利用 Kotlin ,可以使用sealed classesdestructuring declarations使其完全类型安全:

sealed class Route
data class UsersRoute(
    val userId: Int,
    val albumName: String
) : Route()

fun <R: Route> intercept(path: String, cb: (R) -> Unit) = ...

router.intercept("users/:userId") { (userId): UsersRoute -> }
router.intercept<UsersRoute>("users/:userId/albums/:albumName") { (userId, albumName) -> }

如果只具有 users 路线,则甚至不需要通用的密封类方法。