在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)
}
}
短篇小说:第一个测试通过,第二个测试失败。为什么?
长篇小说:当通过read()
类方法调用内联函数时,我正在经历错误的类型推理R
,但直接调用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)
这与reified
无关。我用
val res: MyReply<R> = MyReply()
它不会丢任何错误。此问题是您的JSON.readValue
返回Object
而不是Integer
。Kotlin尝试将其投射到Integer
,但失败。