Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Funcionamento do object : TypeToken<T>() {}.type.

No video "Consumindo dados dos Gamers" , foi realilzado a conversao de uma lista de objeto em json para a estrutura criada no kotlin, mas é necessário o uso do código Gson().fromJson(json, object : TypeToken<T>() {}.type para o seu funcionamento. Porém nao cheguei a entender como essa parte do codigo object : TypeToken<T>() {}.type funciona.

Abaixo está a funcão de conversão para de forma genérica.

inline fun <reified T : Any> jsonToObject(json: String): T {
    return when {
        T::class == String::class -> json as T
        T::class == List::class -> Gson().fromJson(json, object : TypeToken<T>() {}.type)
        else -> Gson().fromJson(json, T::class.java)
    }
}
1 resposta
solução!

Olá, Ademilson!

Entendo que a sintaxe object : TypeToken<T>() {}.type pode parecer um pouco complicada à primeira vista, mas vou tentar simplificar isso para você.

O object : TypeToken<T>() {}.type é uma maneira de lidar com a problemática do apagamento de tipos genéricos em tempo de execução no Java e, consequentemente, no Kotlin. O que acontece é que, em tempo de execução, o Java não sabe qual é o tipo real de um objeto genérico. Por exemplo, se você tem uma lista de objetos List<String>, em tempo de execução, o Java só sabe que é uma List, mas não sabe que é uma lista de String.

O TypeToken é uma classe do Gson que permite preservar informações de tipo em tempo de execução. Quando você cria uma instância anônima de TypeToken com object : TypeToken<T>() {}, você está criando um objeto que mantém a informação de tipo T em tempo de execução. O .type é então usado para obter essa informação de tipo.

Vamos a um exemplo prático. Suponha que você tem um JSON que representa uma lista de strings e quer convertê-lo para um objeto List<String>:

val json = "[\"Hello\", \"World\"]"
val type = object : TypeToken<List<String>>() {}.type
val list = Gson().fromJson(json, type)

Neste caso, type é um Type que representa List<String>. Quando você passa esse Type para Gson().fromJson(), o Gson sabe que deve converter o JSON para uma List<String>, e não apenas para uma List.

Espero ter ajudado e bons estudos!