2013-10-22 14 views
5

IntelliJ IDEA si lamenta di questo codice:IntelliJ IDEA lamenta "conversione numerica implicita di char a int"

char c = 'A'; 
if (c == 'B') return; 

L'avviso è sulla seconda riga:

Implicit numeric conversion from char to int 

Che cosa significa? Cosa si aspetta che faccia?

+0

Non si verifica in Eclipse, forse un'implementazione errata in IntelliJ? O i livelli di avviso sono impostati molto in alto nel tuo IDE? –

+0

Con Idea 13 non produce alcun avviso. – Admit

+0

È necessario attivare l'ispezione "Numeri numerici/Conversione numerica implicita". Tuttavia, non sono interessato a sbarazzarmi dell'avvertimento. Voglio capire di cosa si tratta e migliorare il mio codice – yegor256

risposta

0

È probabilmente più sicuro utilizzare il metodo statico Character.compare(char x, char y) anziché utilizzare ==.

Non ho trovato nulla nel JLS o nel JavaDoc, ma potrebbero esserci potenziali bug unicode usando il metodo. L'avvertenza che hai postato suggeriva che i tuoi caratteri potevano essere ampliati a ints che potevano creare un problema di prestazioni, ma ne dubito davvero. Continuerò a cercare perché ora sono interessato a questo.

2

La spiegazione di ciò è nascosta nel JLS. Si afferma che == è un numerical operator. Se leggi il testo e segui alcuni link, puoi scoprire che char viene convertito in int. E non dice mai esplicitamente che anche questo accade se entrambi gli operandi sono char ma says

Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules: 

* If either operand is of type double, the other is converted to double. 

* Otherwise, if either operand is of type float, the other is converted to float. 

* Otherwise, if either operand is of type long, the other is converted to long. 

* Otherwise, both operands are converted to type int. 

penso che l'ultimo significa implicitamente che char viene sempre convertito. Anche in another section dice "If either operand is not an int, it is first widened to type int by numeric promotion.".

L'avviso che si sta ricevendo potrebbe essere molto severo, ma sembra essere corretto.

0

Tutti i caratteri vengono tradotti in int dal compilatore. Si può anche fare questo:

char a = 'b'; 
int one = a - 46;// it's 40 something... 

Si può sbarazzarsi di questa avvertenza da lanciare il vostro personaggio a int.

char c = 'A'; 
if (c == (int)'B') return; 

o

è possibile utilizzare Character oggetto e utilizzare equal metodo per confrontarlo.

+0

Questo non è del tutto corretto. Un 'char' è un numero intero unsingnato a 16 bit (intero che significa un valore numerico, da non confondere con' int') mentre 'int' è un intero con segno a 32 bit. 'char' può essere usato nelle espressioni arethmic insieme a' int' a causa di [promozione numerica] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6), che avviene in fase di runtime, non in fase di compilazione. –