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.

questionAnswers(2)

yourAnswerToTheQuestion