kotlin中的REFIFIED类型参数的错误推断



在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,但失败。

最新更新