【发布时间】:2018-12-23 13:00:49
【问题描述】:
声明
char c = 10;
编译正常,但是
char d = Integer.parseInt("10");
导致编译错误
“类型不匹配无法从 int 转换为 char”。
这两种说法有什么区别?
【问题讨论】:
声明
char c = 10;
编译正常,但是
char d = Integer.parseInt("10");
导致编译错误
“类型不匹配无法从 int 转换为 char”。
这两种说法有什么区别?
【问题讨论】:
这在 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 的转换。
【讨论】:
int 不是char。它们是java中的两种不同的原始类型。 int 是32bit,char 是8bit。
当你这样做时
char d = Integer.parseInt("10");
您正在将 string "10" 解析为 int,然后您尝试将其分配给 char,除非您明确指定向下转换,否则该字符将不起作用。由于精度下降,编译器会抱怨并要求您明确地向下转换它。如下图所示:
char d = (char) Integer.parseInt("10");
在第一个语句中,
char c = 10;
值 10 在char 的范围内。范围从 (0 - 65,536) 无符号,所以没有问题。假设该值大于此值,您会遇到同样的问题。
【讨论】:
char c = 12334567; 因为无法确定任意的int,它总是抱怨。跨度>
在 JLS 5.2 部分:
赋值上下文允许将表达式的值(第 15.26 节)赋值给变量
如果表达式是字节类型的常量表达式(第 15.28 节), 短、char 或 int:
• 如果满足以下条件,则可以使用缩小基元转换 变量的类型是 byte、short 或 char, 常量表达式可以用变量的类型来表示
什么是constant expression:
常量表达式是表示原始值的表达式 type 或一个不会突然完成并使用 只有以下...
所以,恕我直言,
在char c=10; 中,将int 类型的constant expression 分配给char 类型的变量,并且narrowing primiteve conversion 正在发生。
虽然在char d= Integer.parseInt("10"); 中,Integer.parseInt() 返回了一个int 值,该值具有32 位,并且它将超过char 类型的16 位限制,因此它会抱怨它并要求明确的沮丧。
【讨论】:
首先,请注意int 的容量比char 大得多。
您的第一个示例可以编译,因为编译器仅在 100% 确定转换会成功时才允许进行隐式转换;编译器知道从int 到char 的10 会成功。另一方面,说它是char c=101111; 不编译...
您的第二个示例无法编译,因为 Integer.parseInt("10") 在运行时生成值,编译器无法确定将分配给 d 的值,因此需要显式转换才能编译。
【讨论】:
在第一个中,您将字符值10 分配给字符。如果您打印该字符,它将打印一个新行。因为换行符的字符值为10
但是在第二个中,您试图将 Integer Object 分配给 char,这是不可能的。您只能为 char 分配一个真实字符或字符值
举个例子
char c='A';
char c=65;
这两个都会打印A,因为A的字符值是65
更多信息请参考link
【讨论】:
在此我们将一个字符串转换为一个 int,然后尝试将该 Integer 分配给一个字符。这就是它导致错误的原因
char d = Integer.parseInt("10");
要消除错误,您需要将其类型转换为 char 即
char d=(char)Integer.parseInt("10");
【讨论】: