Il cast è tecnicamente possibile. Javac non può facilmente dimostrare che non è così nel tuo caso e JLS in realtà lo definisce come un programma Java valido, quindi contrassegnare un errore sarebbe errato.
Questo perché Listè un'interfaccia. Quindi potresti avere una sottoclasse di una Dateche implementa effettivamente Listmascherata come Listqui - e poi lanciarla su Datesarebbe perfettamente ok. Per esempio:
public class SneakyListDate extends Date implements List<Foo> {
...
}
E poi:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
Rilevare uno scenario del genere potrebbe non essere sempre possibile, poiché richiederebbe informazioni di runtime se l'istanza proviene, ad esempio, da un metodo. E anche se, richiederebbe molto più sforzo per il compilatore. Il compilatore impedisce solo i cast che sono assolutamente impossibili a causa della mancanza di un modo per l'albero di classe per abbinare affatto. Questo non è il caso qui, come visto.
Nota che JLS richiede che il tuo codice sia un programma Java valido. In 5.1.6.1. Conversione di riferimento ristretta consentita dice:
Esiste una conversione di riferimento restrittiva dal tipo Sdi riferimento al tipo di riferimento Tse sono vere tutte le seguenti condizioni :
- [...]
- Si applica uno dei seguenti casi :
- [...]
Sè un tipo di interfaccia, Tè un tipo di classe e Tnon nomina una finalclasse.
Quindi, anche se il compilatore potrebbe capire che il tuo caso è effettivamente dimostrabilmente impossibile, non è consentito contrassegnare un errore perché JLS lo definisce come un programma Java valido.
Sarebbe consentito solo mostrare un avviso.
Listqui.Date d = (Date) new Object();