在kotlin中,如何返回由泛型类参数定义的实例
我正在努力为kotlin 1.0.3写一个很好的Kotlin包装器。 在这个我试图混入一个函数的请求,让它通过使用杰克逊的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) })
它错误地说,豆的期望值是任何。 我想要的是我的API的工作方式与上面一样,传递给asDataBean方法的泛型“类”定义是返回值的类型。
我也试过了
fun <T> Request.asDataBean(type: KClass<*>): T = mapper.readValue(this.body(), type.java) as T
以及将使用代码更改为
val bean: TestBean = req.asDataBean(TestBean::class)
希望能够正常工作,但是在使用代码时也给出了完全相同的错误。
我如何得到它使用传入的类类型定义的泛型作为参数(非常类似于所有在Java中的spring api的工作)?
在你的例子中的post
函数需要route: (Request, Response) -> Any
参数,这是一个函数,请求和响应,并返回一些非空值。
当你使用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
更多的Kotlin惯用的方法是使用指定的类型参数 :
inline fun <reified T : Any> Request.asDataBean(): T = mapper.readValue(this.body(), T::class.java)
然后可以将其消耗为:
post("/hello", { req, res -> val bean = req.bodyAs<TestBean>() res.body("Ok") })