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 Date
che implementa effettivamente List
mascherata come List
qui - e poi lanciarla su Date
sarebbe 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 S
di riferimento al tipo di riferimento T
se sono vere tutte le seguenti condizioni :
- [...]
- Si applica uno dei seguenti casi :
- [...]
S
è un tipo di interfaccia, T
è un tipo di classe e T
non nomina una final
classe.
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.
List
qui.Date d = (Date) new Object();