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