当前位置: 首页 > 知识库问答 >
问题:

从类调用内联函数

贝嘉泽
2023-03-14

简而言之:我想创建一个类型为T的泛型类,它应该调用一个类型为T的具体化内联函数,以便能够更通用地使用Gson

class GenericNetworkService<RESPONSE_TYPE> {

    fun getDataFromServer(url: String): RESPONSE_TYPE {
        val request = Request.Builder().url(url).build()

        val response = OkHttpClient().newCall(request).execute()

        val convertor = Gson()

        val result: RESPONSE_TYPE = convertor.fromJson(response.body!!.string(), RESPONSE_TYPE)

        return result

    }
}

//calling
//fun main() {

//    val listOfPersons = GenericNetworkService<List<Person>>().getDataFromServer(url1)
//    println(listOfPersons)

//    val listOFTeacher = GenericNetworkService<List<Teacher>>().getDataFromServer(url2)
//    println(listOFTeacher)
// }

inline fun <reified T> fromJson(json: String): T {
   return Gson().fromJson(json, object: TypeToken<T>(){}.type)
}

//calling : 
// val data : List<Teacher> = fromJson(response)


private inline fun <reified RESPONSE_TYPE> getGenericRespSync(url: String): RESPONSE_TYPE {
    val okHttpClient = generateNetworkClient()
    val request = Request.Builder().url(url).build()
    val response: Response = okHttpClient.newCall(request).execute()

    val body: Reader = response.body!!.charStream()
    val finalResponse: RESPONSE_TYPE =  getConvertedListForResponse(body) //this is the same reified inline function as above with some non signinficant additions
    return finalResponse
}


但是我希望我的其他类通过某个类实例调用这个函数。例如,类似于genericNetworkService >().getGenericrespSync(url1) 应该返回列表,而不是直接调用getGenericrespSync(url1)。我如何实现这样的功能?

共有1个答案

谷飞星
2023-03-14

你可以定义

inline fun <reified RESPONSE_TYPE> GenericNetworkService<RESPONSE_TYPE>.getGenericRespSync1(url: String): RESPONSE_TYPE = getGenericRespSync<RESPONSE_TYPE>(url)

(我以不同的方式命名了这个函数,这样它就可以调用以前定义的getGenericrespSync)。当然,它只使用它调用的实例来获取它的类型参数,否则将忽略它。

 类似资料:
  • 例外情况。kt: 在科特林: 它在kotlin中工作,函数是内联的。 但是当在Java代码中使用时,它就是不能内联,仍然是一个正常的静态方法调用(从反编译的内容中可以看出)。 像这样的东西:

  • 问题 当你编写使用回调函数的代码的时候,担心很多小函数的扩张可能会弄乱程序控制流。 你希望找到某个方法来让代码看上去更像是一个普通的执行序列。 解决方案 通过使用生成器和协程可以使得回调函数内联在某个函数中。 为了演示说明,假设你有如下所示的一个执行某种计算任务然后调用一个回调函数的函数(参考7.10小节): def apply_async(func, args, *, callback):

  • 我在班里学习。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(inti)来调用它时,代码不会编译。 因为内部类是外部类的一部分(成员),必须通过外部类访问它们。如何调用测试类的超级构造函数。 编译错误是:由于某些中间构造函数调用,没有外部类型的封闭实例可用

  • 我正在尝试通过与分支内联的am调用c中的外部函数。我正在编译为arm m0指令集,但它返回错误表达式。 代码是: 回报是: 我们需要做什么?

  • 问题内容: 说,我想在gcc的内联汇编中调用具有以下签名的函数。我怎样才能做到这一点? 问题答案: 通常,您会想要做类似的事情 也就是说,您根本不需要在嵌入式asm中进行函数调用。这样,您不必担心调用约定或堆栈框架管理的细节。

  • 在我的代码中,我使用了预处理器宏 但后来我意识到我需要一个内联函数,并最终得到了以下代码 它有效吗?这似乎有效,但不会造成任何潜在问题吗?