How does Retrofit.create() extenstion function works with no class refrence parameter?

40 views Asked by At

I have a Hilt module to provide Retrofit API in my app like so:

@Module
@InstallIn(SingletonComponent::class)
object NetworkDataModule {

    @Provides
    @Singleton
    fun provideOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
            .addInterceptor(
                HttpLoggingInterceptor().apply {
                    level = HttpLoggingInterceptor.Level.BODY
                }
            )
            .build()
    }

    @Provides
    @Singleton
    fun provideMyApi(client: OkHttpClient): MyApi {
        return Retrofit.Builder()
            .baseUrl(MyApi.BASE_URL)
            .addConverterFactory(MoshiConverterFactory.create())
            .client(client)
            .build()
            .create()
    }
}

And it is my API interface:

interface MyApi {

    @GET("search")
    suspend fun search(): searchDto

    companion object {
        const val BASE_URL = "https://myapi.com/"
    }
}

The question is how the Retrofits create() extension function knows which class should it return despite I did not pass any information about the MyApi interface to it. The create function implementation is this:

inline fun <reified T> Retrofit.create(): T = create(T::class.java)

How does create(T::class.java) return MyApi in spite of I did not provide any type for T?

My retrofit version is 2.9.0

0

There are 0 answers