考虑到Kotlin中的以下代码:
import com.fasterxml.jackson.module.kotlin.*
data class MyReply<R> (
val results : Array<R>? = null
)
class ErrorClient() {
val JSON = jacksonObjectMapper()
inline fun<reified R> request(): Array<R>? {
val json_in = """{"results": [2]}"""
val res: MyReply<R> = JSON.readValue(json_in)
return res.results
}
fun read(): Array<Int>? {
val res: Array<Int>? = request()
return res
}
}
以及以下测试:
import org.junit.Test
class ErrorTest {
val client = ErrorClient()
@Test
fun `direct`() {
val res: Array<Int>? = client.request()
println(res)
}
@Test
fun `indirect`() {
val res : Array<Int>? = client.read()
println(res)
}
}
短篇小说:第一次测试通过,第二次测试失败。为什么呢?
长篇故事:当通过R
类方法调用内联函数时,我遇到了参数化参数read()
的错误类型推断,但直接调用request()
有效。在间接情况下,类型被错误地推断为java.lang.Object,因此测试失败并带有
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
at ErrorClient.read(Error.kt:17)
at ErrorTest.indirect(ErrorTest.kt:14)
答案 0 :(得分:0)
这不是reified
。我用
val res: MyReply<R> = MyReply()
它不会抛出任何错误。这个问题是您的JSON.readValue
返回Object
而不是Integer
。 Kotlin尝试将其投射到Integer
,但它失败了。