den folgenden Code in Kotlin Gegeben:Falsche Schlussfolgerung für verdinglichten Typparameter in 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
}
}
und die folgenden Tests:
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)
}
}
Kurze Geschichte: Die ersten Testdurchläufe und die zweite nicht. Warum?
Lange Geschichte: Ich habe eine falsche Typinferenz des verdinglichten Parameter R
erlebe, wenn die Inline-Funktion über die read()
Klasse-Methode aufrufen, aber der direkte Aufruf von request()
funktioniert. Es geht nicht um reified
im indirekten Fall wird der Typ erronously gefolgert mit
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)
Das geht nur, weil MyReply(). Ergebnisse ist Null, die auf jeden beliebigen Typ –
@AdamSzalkowski gegossen werden kann Das ist die Antwort. Ihr 'JSON.readValue' gibt' Integer' nicht zurück. Wenn Sie es hart um 'val res: MyReply = MyReply (ArrayOf (1)) als MyReply ', es immer noch übergeben. Es ist offensichtlich, dass 'JSON.readValue' falsch ist. –
Joshua
Mein Problem ist, dass es im "direkten" Fall Int zurückgibt und in der "indirekten" Object zurückgibt. Warum? –