如何得到在Kotlin中具体化的值?

xtfmy6hx  于 2023-01-26  发布在  Kotlin
关注(0)|答案(1)|浏览(123)

我开始与kotlin和卡住了一个问题。
我有一个请求函数如下:

fun dumRequest(): MyRequest {
        val token = JwtTokenGenerator.createToken(user)
        return MyRequest(token.serialize())
    }

它作为一个参数传递给一个函数:

val response: ResponseEntity<MyRequest> = callMyRequest(dumRequest())

并且callMyRequest()是如下的泛型类型:

private inline fun <reified T, reified Y> callMyRequest(request: Y): ResponseEntity<T> {
        val headers = HttpHeaders()
        headers.add(CONTENT_TYPE, "application/json")
        headers.add(AUTHORIZATION, request.token) // I want something like this here

        // other business logic
    }

我想从传递给callMyRequest()的请求对象中获取token,并在AUTH头中设置它。但由于这是一个泛型类型,不确定如何从中获取令牌字段?
任何帮助都将不胜感激。
短暂性脑缺血发作

zwghvu4y

zwghvu4y1#

我真的不认为你需要在这里具体化Y,将它限制在一个包含令牌的接口上就足够了,然后让MyRequest实现这个接口,就像<Y : AuthenticatedRequest>一样。
实际上,您根本不需要Y类型参数,因为您可以直接将接口类型作为参数。
大概是这样的

interface AuthenticatedRequest {
    val token: String
}

data class MyRequest(override val token: String) : AuthenticatedRequest

private inline fun <reified T> callMyRequest(request: AuthenticatedRequest): ResponseEntity<T> {
    val headers = HttpHeaders()
    headers.add(CONTENT_TYPE, "application/json")
    headers.add(AUTHORIZATION, request.token) // I want something like this here

    // other business logic
}

当你想把结果反序列化为T时,reified的值就派上用场了,它可以让你不用直接处理类对象就可以做类似response.readEntity<T>()的事情。

相关问题