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.
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::getItem
deve 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 getItem
método:
private static <T> T getItem(Object json)
{
return mapper.readValue(json.toString(), new TypeReference<T>() {};
}
Usando TypeReference
aqui não ajuda, porque T
nã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 readValue
assinatura, que não leva a TypeReference
.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras