Questo viene chiamato Limitazione tipo casting. Da oracle docs
:
22 conversioni specifiche su tipi primitivi sono chiamati restringimento conversioni primitive:
breve per byte o char
char per byte o breve
int a byte, short, o char
long to byte, short, char, o int
galleggiante per byte, short, char, int, o lungo
doppio di byte, short, char, int, long, o galleggiare
un restringimento di conversione primitivo può perdere informazioni sulla grandezza globale di un valore numerico e potrebbe anche perdere precisione e intervallo .
In Java, ci sono due tipi fondamentali di conversioni di tipo: allargando e restringimento.
A widening conversion
si verifica quando si converte da un tipo con più piccolo (o più stretto) da digitare con intervallo maggiore (o più ampio). Per questo motivo, non vi è alcuna possibilità di perdita di dati e la conversione è considerata "sicuro" .
Un narrowing conversion
si verifica quando si converte da un tipo con i più grandi (o più largo) per digitare con i più piccoli (o ristretta) gamma. Dal momento che si stanno riducendo la gamma, c'è una possibilità di perdita di dati in modo da questa conversione è considerata "non sicuro"

La conversione da byte a char è un caso speciale e rappresenta allargamento e restringimento allo stesso tempo.La conversione inizia convertendo il byte a un int e quindi la int viene convertito al char.
Una ragione per cui non riesco a pensare perché il restringimento del tipo di casting non si traduce in un errore/eccezione è quello di consentire una conversione di tipo conveniente/facile/veloce nei casi in cui nessun dato sarà perdita. Il compilatore ci lascia il compito di assicurarci che i dati convertiti siano in grado di adattarsi alla gamma più piccola. È anche utile se vogliamo troncare rapidamente valori come l'arrotondamento del valore di uno double
(digitandolo per tipo su uno int
).
Forse i progettisti linguistici implementano le funzionalità in ogni caso nel caso qualcuno la trovasse utile a scapito della maggiore probabilità di errori commessi da programmatori inesperti. Sono d'accordo che sarebbe più bello se in questo scenario venisse data una sorta di avvertimento del compilatore – gerrytan
BTW-Java usa Unicode, non ASCII. Il tipo di dati 'char' di Java memorizza un'unità di codice UTF-16, una o due delle quali codificano un punto di codice Unicode. Un punto di codice di base e zero o più codici combinati formano un grafema, che è ciò che la gente pensa quando usa il termine "carattere". –