O elenco é tecnicamente possível. Não é possível provar facilmente pelo javac que não é assim no seu caso e o JLS realmente define isso como um programa Java válido, portanto, sinalizar um erro seria incorreto.
Isso ocorre porque Listé uma interface. Então, você poderia ter uma subclasse de um Dateque realmente implementa Listdisfarçada como Listaqui - e, em seguida, convertê-la Dateseria perfeitamente aceitável. Por exemplo:
public class SneakyListDate extends Date implements List<Foo> {
...
}
E depois:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
Detectar tal cenário nem sempre é possível, pois exigiria informações de tempo de execução se a instância vier de, por exemplo, um método. E mesmo que isso exigiria muito mais esforço para o compilador. O compilador apenas evita lançamentos que são absolutamente impossíveis, porque não há como a árvore de classes corresponder. O que não é o caso aqui, como visto.
Observe que o JLS requer que seu código seja um programa Java válido. No 5.1.6.1. Conversão de referência restrita permitida diz:
Existe uma conversão de referência de restrição de tipo Sde referência para tipo de referência, Tse todas as seguintes forem verdadeiras :
- [...]
- Um dos seguintes casos se aplica :
- [...]
Sé um tipo de interface, Té um tipo de classe e Tnão nomeia uma finalclasse.
Portanto, mesmo que o compilador possa descobrir que seu caso é realmente comprovadamente impossível, não é permitido sinalizar um erro porque o JLS o define como um programa Java válido.
Só seria permitido mostrar um aviso.
Listaqui.Date d = (Date) new Object();