【发布时间】:2016-07-11 05:36:47
【问题描述】:
我正在尝试为针对 kotlin 1.0.3 的 Web 框架编写一个不错的 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)
})
错误地说 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 中的工作方式)?
【问题讨论】:
-
很奇怪,第一个sn-p对我有用。您能否提供一个没有外部依赖的最小独立示例?
-
我不确定我是否理解。我创建了一个 github 存储库以在 github.com/sepatel/kotlin-seed 处显示代码。这是整个项目,希望能帮助更好地描述问题?它给出的错误是使用 API 的编译错误,说“e: Main.kt: (23, 9): Expected a value of type Any e: Main.kt: (23, 34): Type inference failed:没有足够的信息来推断 fun
Request.asData(type: KClass): T" 中的参数 T
标签: generics kotlin kotlin-extension