在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") })