2013-10-22 32 views
5

IntelliJ IDEA phàn nàn về mã này:IntelliJ IDEA phàn nàn về "chuyển đổi số tiềm ẩn của char sang int"

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

Cảnh báo là trên dòng thứ hai:

Implicit numeric conversion from char to int 

có nghĩa là gì? Tôi mong đợi tôi sẽ làm gì?

+0

Không xảy ra trong Eclipse, có thể triển khai sai trong IntelliJ? Hoặc mức độ cảnh báo được đặt rất cao trong IDE của bạn? –

+0

Với ý tưởng 13 nó không tạo ra bất kỳ cảnh báo nào. – Admit

+0

Bạn nên bật "Kiểm tra số phát hành/Chuyển đổi số ngầm định". Tuy nhiên, tôi không quan tâm để thoát khỏi cảnh báo. Tôi muốn hiểu nó là gì và cải thiện mã số của tôi – yegor256

Trả lời

0

Có thể an toàn hơn khi sử dụng phương thức tĩnh Character.compare(char x, char y) thay vì sử dụng ==.

Tôi chưa tìm thấy bất kỳ thứ gì trong JLS hoặc trong JavaDoc, nhưng có thể có lỗi unicode tiềm ẩn khi sử dụng phương thức của bạn. Cảnh báo bạn đã đăng gợi ý rằng các ký tự của bạn có thể được mở rộng thành các int mà có thể có thể tạo ra một vấn đề hiệu năng, nhưng tôi thực sự nghi ngờ điều đó. Tôi sẽ tiếp tục tìm kiếm vì bây giờ tôi quan tâm đến điều này.

2

Giải thích cho điều này bị ẩn trong JLS. Nó tuyên bố rằng ==numerical operator. Nếu bạn đọc văn bản và làm theo một số liên kết, bạn có thể tìm ra rằng char được chuyển đổi thành int. Nó không bao giờ nói một cách rõ ràng rằng điều này cũng sẽ xảy ra nếu cả hai toán hạng là char nhưng nó 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. 

Tôi nghĩ người cuối cùng ngầm nghĩa là char luôn chuyển đổi. Cũng trong số another section nó cho biết "If either operand is not an int, it is first widened to type int by numeric promotion.".

Cảnh báo bạn đang nhận có thể rất nghiêm ngặt, nhưng có vẻ như là chính xác.

0

Tất cả các ký tự được biên dịch bởi int bởi bộ compilator. Bạn thậm chí có thể làm điều này:

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

Bạn có thể loại bỏ cảnh báo này bằng cách truyền ký tự của bạn vào int.

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

hoặc

bạn có thể sử dụng Character đối tượng và sử dụng equal phương pháp để so sánh nó.

+0

Điều này không hoàn toàn chính xác. 'Char' là một số nguyên không có 16 bit (số nguyên nghĩa là giá trị số, không bị nhầm lẫn với' int') trong khi 'int' là số nguyên có dấu 32 bit. 'char' có thể được sử dụng trong các biểu thức arethmic cùng với' int' vì [khuyến mãi số] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6), xảy ra khi chạy, không biên dịch thời gian. –

Các vấn đề liên quan