声明
char c = 10;
编译正常,但是
char d = Integer.parseInt("10");
导致编译错误
“类型不匹配无法从int转换为char”。
这两个语句有什么区别?
答案 0 :(得分:3)
这在Java语言规范5.2分配上下文中有记录:
此外,如果该表达式是以下内容的常量表达式(第15.28节) 输入byte,short,char或int类型:
- 如果变量的类型是
byte
,short
或char
,并且常量表达式的值是 可以表示为变量的类型。
10
是一个常量表达式,在char
中可以表示10(char
可以存储0〜65535),因此从int
到char
的转换被允许。 Integer.parseInt("10")
不是常数表达式(必须在运行时求值),因此此处不允许从int
到char
的转换。
答案 1 :(得分:1)
org.xml.sax.SAXParseException;
lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
不是int
。它们是Java中的两种不同的原始类型。一个int为char
,一个char为32bit
。
完成时
8bit
您正在将char d = Integer.parseInt("10");
“ 10”解析为string
,然后尝试将其分配给一个char,除非您明确指定向下转换,否则该char将不起作用。由于精度下降,编译器会抱怨并要求您显式降低精度。向下投射,如下所示:
int
在第一句话中,
char d = (char) Integer.parseInt("10");
值10在char c = 10;
的范围内。范围是(0-65,536)无符号,因此没有问题。假设该值大于此值,您将遇到相同的问题。
答案 2 :(得分:1)
在JLS 5.2部分:
赋值上下文允许将表达式的值赋给变量(第15.26节)
如果该表达式是字节类型的常量表达式(第15.28节), 简称,字符或整数:
•如果满足以下条件,则可以使用缩小原始转换 变量的类型为byte,short或 char ,而 常数表达式可以表示为变量的类型
什么是constant expression
:
常量表达式是表示原始值的表达式 类型或不是突然完成且由以下内容组成的字符串 仅以下...
所以,恕我直言,
在char c=10;
中,类型constant expression
的{{1}}被分配给类型int
的变量,并且正在发生char
。
在narrowing primiteve conversion
中,char d= Integer.parseInt("10");
返回一个int
位的Integer.parseInt()
值,该值将超过{ {1}}类型,因此它抱怨并要求显式降级。
答案 3 :(得分:0)
首先,请注意int
的容量比char
大得多。
您的第一个示例将进行编译,因为只有在100%确定转换成功后,编译器才允许进行隐式转换。编译器知道从10
到int
的{{1}}将成功。另一方面,说是char
无法编译...
您的第二个示例未编译,因为char c=101111;
在运行时生成了值,并且编译器无法告知将为Integer.parseInt("10")
分配什么值,因此需要显式强制转换才能进行编译。
答案 4 :(得分:0)
在第一个中,您要为字符分配字符值10
。如果您打印字符,它将打印新行。因为换行符的字符值为10
但是在第二个示例中,您试图将Integer
Object
分配给char
,但这是不可能的。您只能为char指定一个实字符或一个字符值
例如
char c='A';
char c=65;
这两个都将打印A
,因为A
的字符值为65
也请参考此link以获得更多信息
答案 5 :(得分:0)
在这种情况下,我们将字符串转换为整数,然后尝试将该整数分配给字符。这就是为什么会导致错误的原因
char d = Integer.parseInt(“ 10”);
要消除该错误,您需要将其类型转换为char类型,即
char d =(char)Integer.parseInt(“ 10”);