Fragmento de código en Kotlin
public actual fun <R, T> (suspend R.() -> T).createCoroutineUnintercepted( receiver: R, completion: Continuation<T> ): Continuation<Unit> { val probeCompletion = probeCoroutineCreated(completion) return if (this is BaseContinuationImpl) create(receiver, probeCompletion) else { createCoroutineFromSuspendFunction(probeCompletion) { (this as Function2<R, Continuation<T>, Any?>).invoke(receiver, it) } } } Lo que quiero saber es cómo (suspend R.() -> T) AKA Function Type puede reconocerse como BaseContinuationImpl que es un Classify Type de clasificación incluso para emitir como 'Función2'.
Cualquier ayuda será apreciada.
No hay tipos de funciones y tipos de clases separados. Los tipos de función son solo tipos que se pueden ejecutar con argumentos específicos y un tipo de retorno específico. Son intercambiables con las interfaces Function0 , Function1 , etc. y contienen una única función de invoke() .
Podemos implementar un tipo de función por nuestra clase:
class MyClass : (suspend () -> Unit) { override suspend fun invoke() {} }Ahora, obtengamos este código:
val lambda: (suspend () -> Unit) = {}Después de desmontar, vemos que nuestra lambda se compila en:
final class FooKt$foo$lambda$1 extends kotlin/coroutines/jvm/internal/SuspendLambda implements kotlin/jvm/functions/Function1 { ... public final invoke(Ljava/lang/Object;)Ljava/lang/Object; ... } Extiende SuspendLambda que es un subtipo de BaseContinuationImpl . También implementa Function1 y contiene la función de invoke , lo que la convierte en un tipo de función.