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 Date
que realmente implementa List
disfarçada como List
aqui - e, em seguida, convertê-la Date
seria 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 S
de referência para tipo de referência, T
se todas as seguintes forem verdadeiras :
- [...]
- Um dos seguintes casos se aplica :
- [...]
S
é um tipo de interface, T
é um tipo de classe e T
não nomeia uma final
classe.
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.
List
aqui.Date d = (Date) new Object();