1
resposta

interface

package br.com.alura.screenmatch.service;

public interface IConverteDados {
    **<T> T**  obterDados(String json, **Class<T> classe**);
}
 

Não consigo compreender do por que usaria essas partes do código em negrito o que faz esta "class" onde vive o que come, estou muito perdido !

1 resposta

Oi Robert! Tudo bem?

Sei bem como essas partes do código podem ser um pouco confusas no começo, mas vou tentar explicar de uma maneira simples para ajudar você a entender. Você verá aqui no Globo Re.. Fórum da Alura!

<T> T no método

Essa notação é usada para indicar que o método é genérico. Em outras palavras, ele pode trabalhar com qualquer tipo de dado. O <T> é um marcador de tipo genérico. Quando você vê <T>, isso significa que o método pode retornar qualquer tipo de objeto, e o tipo específico será determinado quando o método for chamado.

Class<T> classe como parâmetro

O parâmetro Class<T> classe é usado para passar a classe do tipo que você quer que o JSON seja convertido. Isso é necessário porque, no momento da execução, o Java precisa saber o tipo exato para o qual o JSON será convertido.

Exemplo Prático: Vamos imaginar que você tem duas classes, DadosSerie e DadosEpisodio, e você quer converter um JSON para uma dessas classes dependendo do contexto.

public class DadosSerie {
    private String titulo;
    private int totalTemporadas;
    // Getters e Setters
}

public class DadosEpisodio {
    private String titulo;
    private int numeroEpisodio;
    // Getters e Setters
}

Com a interface genérica IConverteDados, você pode criar um método que pode converter JSON para qualquer uma dessas classes:

public interface IConverteDados {
    <T> T obterDados(String json, Class<T> classe);
}

E a implementação ficaria assim:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ConverteDados implements IConverteDados {
    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public <T> T obterDados(String json, Class<T> classe) {
        try {
            return mapper.readValue(json, classe);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

Agora, você pode usar essa implementação para converter JSON para DadosSerie ou DadosEpisodio:

public class Main {
    public static void main(String[] args) {
        ConverteDados conversor = new ConverteDados();
        
        String jsonSerie = "{ \"titulo\": \"Breaking Bad\", \"totalTemporadas\": 5 }";
        DadosSerie dadosSerie = conversor.obterDados(jsonSerie, DadosSerie.class);
        System.out.println(dadosSerie.getTitulo()); // Saída: Breaking Bad

        String jsonEpisodio = "{ \"titulo\": \"Pilot\", \"numeroEpisodio\": 1 }";
        DadosEpisodio dadosEpisodio = conversor.obterDados(jsonEpisodio, DadosEpisodio.class);
        System.out.println(dadosEpisodio.getTitulo()); // Saída: Pilot
    }
}

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.