Можно перегрузить intercept
n-раз в общем и вывести тип с помощью лямбда-определения:
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?
, и вы можете этого не делатьполучить любую информацию об имени или типе, который вы объявили с помощью лямбды, и использование неправильного типа приведет к исключениям.
Чтобы использовать Kotlin в полном объеме, вы можете сделать все этобезопасный для типов с запечатанными классами и декларациями деструктурирования :
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 , вы даже не сможетенужен общий и закрытый подход к классу.