Diferença de atribuibilidade com curingas aninhados em Java 7/8 genéricos
O seguinte compila perfeitamente no JDK8, mas fornece umtipos incompatíveis erro no JDK7.
List<List<? extends Number>> xs = Arrays.asList(Arrays.asList(0));
De acordo comesta resposta, List<List<? extends Number>>
não tem uma relação de supertipo paraList<List<Integer>>
.
O que mudou no Java 8 que fez essa atribuição funcionar? Também estou tendo dificuldade para entender por quenão trabalhar em Java 7.
Ambas as instruções são compiladas sem erro de tipo usando o JDK7:
List<? extends Number> xs = Arrays.asList(0);
List<? extends List<? extends Number>> ys = Arrays.asList(Arrays.asList(0));
Parece-me muito pouco intuitivo que ambos funcionem no JDK7, mas o exemplo original acima não. Todos eles, obviamente, funcionarão no JDK8. Acho que para realmente entender o que está acontecendo aqui, preciso entender por que esses exemplos são legais no Java 7, mas o exemplo original não.