对Kotlin中特定类型参数的错误推断
鉴于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
但失败。