【发布时间】:2017-09-29 07:17:51
【问题描述】:
在 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)
【问题讨论】:
标签: kotlin kotlin-reified-type-parameters