2014-10-08 9 views
8

Perché è consentito char c = (char)65.8; in Java?Perché il cast di doppio è consentito in Java?

Non dovrebbe generare un errore poiché 65.8 non è un valore Unicode esatto? Capisco che il doppio sia troncato a un numero intero, in questo caso, 65, ma mi sembra un cattivo progetto per consentire al programmatore di creare un cast del genere.

+0

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

+0

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". –

risposta

10

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"

narrowing type conversion

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).

+0

Dove andrebbero i calchi di allargamento e restringimento? – Kootling

+1

tra 'byte' e' corto'. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – nem035

+0

Questo ha senso, poiché 'char' è 16 bit. Ma allora perché abbiamo bisogno di lanciare un 'byte' a un' char', anche se dovrebbe essere una conversione allargata? – Kootling

1

Come può il computer stupido sapere cosa si intende?

char c = (char)65.8; // valid, double gets converted and explicitly truncated to a char 

Può così accadere che durante un calcolo, si potrebbe fare alcuni calcoli complessi che coinvolgono doppia aritmetica e, infine, sul valore finale, si applica la trucation e il display come un personaggio. Cosa c'è che non va?

+0

È una domanda abbastanza valida per chiedere perché questo calcolo è espresso come un cast di tipo piuttosto che come una chiamata a un metodo statico. –

4

non avviene automaticamente nell'assegnazione: sarebbe un errore di compilazione.

Il fatto che il programmatore effettui una scelta consapevole (ad esempio il tipo di cast) significa che sta prendendo in considerazione la possibilità e la responsabilità di un possibile troncamento.

+0

Sarebbe considerata una cattiva pratica lanciare un doppio in un char? – Kootling

+1

sembra insolito, ma sono sicuro che c'è un caso d'uso legittimo là fuori. – Kevin

2

È possibile che si disponga di codice come algoritmi di crittografia che potrebbero risultare utili per trasmettere un double o float a char. Inoltre, char è un tipo senza segno, il che significa che (char)200.5 produce qualcosa di diverso da (char)(byte)200.5.