Stream de recolha com o tipo genérico

Paulo :

Estou tentando usar genérico em um método onde eu desserializar um JSON em pojo para que ele pudesse retornar qualquer tipo de objeto.

Aqui o meu código:

private Bla(List<A> as, List<B> bs)
{
    this.as = as;
    this.bs = bs;
}

public static Bla from(JsonObject json)
{
    return new Bla(Bla.<A>load(json, As), Bla.<B>load(json, Bs));
}

private static <T> List<T> load(JsonObject jsonObject, String param)
{
    return jsonObject.getJsonArray(param).stream()
                                         .map(Bla::getItem)
                                         .collect(Collectors.toList());
}

private static <T> T getItem(Object json)
{
    try {
        return mapper.readValue(json.toString(), new TypeReference<T>() {
        });
    } catch (IOException e) {
        throw new RuntimeException("Error parsing json items", e);
    }
}

O problema é que .collect(Collectors.toList());parece não causa compilação não pode resolver o tipo de instância.

O erro de compilação é:

Erro: (43, 25) Java: os tipos incompatíveis: variável inferência T tem incompatíveis limites 
        restrições de igualdade: T 
        limites inferiores: Java.lang.Object

Para evitar confusão no meu exemplo A e B são Pojos

Saudações.

Marko Topolnik:

Vamos examinar este método:

private static <T> List<T> load(JsonObject jsonObject, String param)
{
    return jsonObject.getJsonArray(param).stream()
                                         .map(Bla::getItem)
                                         .collect(Collectors.toList());
}

O tipo da última etapa, Collectors.toList()deve ser List<T>, mas para obtê-lo o tipo de etapa anterior, Bla::getItemdeve ser inferida como T getItem. Desde getItemé um método genérico, este precisa de um complexo padrão de propagação tipo de restrição que é aparentemente mais de inferência de tipos de Java irá lidar. Para resolver isso, ajudar o compilador com uma dica:

.map(Bla::<T>getItem)

(Crédito para este vai para sintática usuário variante antecessor Nandor Black).

Uma segunda questão é o seu getItemmétodo:

private static <T> T getItem(Object json)
{
    return mapper.readValue(json.toString(), new TypeReference<T>() {};
}

Usando TypeReferenceaqui não ajuda, porque Tnão é um tipo de concreto. Ele permanecerá não-reificada na classe anônima que o compilador cria aqui, portanto, Jackson terá nenhuma sugestão útil a partir dele. Você pode apenas usar uma simples readValueassinatura, que não leva a TypeReference.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Extensão de tipo genérico com um novo tipo genérico em Swift

Padrão de comando com tipo de retorno genérico

Padrão de comando com tipo de retorno genérico

Detecção de tipo incorreto em lambda com genérico

LambdaMetaFactory com a implementação concreta de tipo genérico

Desserialização Java de tipo genérico com Gson

Irregularidades com o (?) De tipo genérico curinga

Kotlin - função abstrata com tipo de retorno genérico

Padrão Java Builder com limites de tipo genérico

Detecção de tipo incorreto em lambda com genérico

Restrição de tipo genérico Swift com operador ou

typescript: tipo genérico com restrição de tipos primitivos

Uma função com tipo de retorno genérico

Função com um tipo de parâmetro genérico

Tratamento de retorno de enum com tipo genérico e não genérico em ferrugem

O método genérico lida com IEnumerable de maneira diferente do tipo genérico

Invocar método genérico com parâmetro de tipo genérico usando reflexão

Como invocar um método genérico com tipo de retorno genérico usando reflexão

Não é possível colocar no mapa Java com tipo de chave genérico e tipo de valor genérico aninhado

O tipo não genérico 'DelegateCommand' não pode ser usado com argumentos de tipo

Como retornar o mesmo tipo de coleção genérico com tipo de elemento diferente?

Conversão de tipo genérico versus conversão de tipo com parâmetro

Obtendo o tipo genérico de DeclaringType de um tipo aninhado em C # com reflexão

Função com tipo genérico

Função de empacotamento de texto de tipo com tipo genérico

geração de coleção genérica com um tipo genérico

Compare o parâmetro genérico aberto com o tipo de interface genérica aberta

O tipo genérico com restrição de tipo de parâmetro não pode ser passado para o método com parâmetro não genérico

Como escrever um tipo de fluxo para a função de seta com tipo genérico