gpt4 book ai didi

generics - 在kotlin中,如何返回由泛型类参数定义的实例

转载 作者:IT老高 更新时间:2023-10-28 13:47:15 27 4
gpt4 key购买 nike

我正在尝试为针对 kotlin 1.0.3 的 Web 框架编写一个不错的 Kotlin 包装器。在那我试图将一个函数混合到请求中,让它通过使用 jackson 的 JSON 转换返回一个 bean。

所以在我的图书馆里,我有以下内容

private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule())
fun <T : Any> Request.asDataBean(type: KClass<T>): T = mapper.readValue(this.body(), type.java)

但是当我这样使用代码时

post("/hello", { req, res ->
val bean = req.asDataBean(TestBean::class)
})

错误地说 bean 的期望值为 Any。我想要的是让我的 API 像上面一样工作,其中传递给 asDataBean 方法的通用“类”定义是返回的值的类型。

我也试过了

fun <T> Request.asDataBean(type: KClass<*>): T = mapper.readValue(this.body(), type.java) as T

以及将使用代码更改为

val bean: TestBean = req.asDataBean(TestBean::class)

希望让它工作,但他们在使用代码时也会给出完全相同的错误。

如何让它使用由作为参数传入的类类型定义的泛型(非常类似于所有 spring api 在 java 中的工作方式)?

最佳答案

您示例中的

post 函数需要 route: (Request, Response) -> Any 参数,这是一个函数,接受请求和响应并返回一些非空值(value)。

当您将 lambda 表达式用作 route 时,它的返回类型是从 lambda 主体的最后一个表达式推断出来的,并且由于在 Kotlin 中赋值不是表达式,因此以下 lambda 不会完全有返回类型:

{ req, res ->
val bean = req.asDataBean(TestBean::class)
}

要使其工作,只需将 bean 设为最后一个表达式

{ req, res ->
val bean = req.asDataBean(TestBean::class)
bean
}

或者根本不使用赋值:

{ req, res -> req.asDataBean(TestBean::class) }

注意:我使用了asDataBean函数的如下定义:

fun <T: Any> Request.asDataBean(type: KClass<T>): T =
mapper.readValue(this.body(), type.java)

你也可以做一个具体化的重载,它调用非具体化的重载,这样你就不必暴露所有的内部:

inline fun <reified T: Any> Request.asDataBean(): T = 
asDataBean(T::class)

req.asDataBean<TestBean>() // usage

关于generics - 在kotlin中,如何返回由泛型类参数定义的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38299789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com