2017-09-29 2 views
0

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) 

Antwort

0

java.lang.Object und damit der Test nicht erfolgreich zu sein. Ich teste den Code mit

val res: MyReply<R> = MyReply() 

Es wirft keine Fehler. Dieses Problem ist Ihre JSON.readValue Rückgabe Object anstelle von Integer. Kotlin versuchen, es auf Integer zu werfen, aber es schlägt fehl.

+0

Das geht nur, weil MyReply(). Ergebnisse ist Null, die auf jeden beliebigen Typ –

+0

@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

+0

Mein Problem ist, dass es im "direkten" Fall Int zurückgibt und in der "indirekten" Object zurückgibt. Warum? –

Verwandte Themen