Kotlin中对具体类型参数的错误推断

时间:2017-09-29 07:17:52

标签: kotlin kotlin-reified-type-parameters

考虑到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)

1 个答案:

答案 0 :(得分:0)

这不是reified。我用

测试代码
val res: MyReply<R> = MyReply()

它不会抛出任何错误。这个问题是您的JSON.readValue返回Object而不是Integer。 Kotlin尝试将其投射到Integer,但它失败了。