我已经学习 Java 两个月了,每次我认为我开始掌握它时,我意识到我仍然缺乏一些扎实的基础知识。
目前正在准备考试,其中一项练习是检测编译错误。虽然给出了答案,但我仍然不明白其中大部分错误。
这是代码:
boolean b = true;
String s;
char c = '8'; // unicode = 56
byte k = 6;
int i = 7;
b = !b < false; // compilation error #1
s = k + c + "" + (c < 8);
s = k + c + (c < 8) + "" ; // compilation error #2
c = c + 1; // compilation error #3
b = b + ""; // compilation error #4
c++;
b = true == (!(true != !(i != 7)) !=b || (c < '2'));
b = (true || false) == 1 && b; // compilation error #5
我了解错误 #1 和 #5。
我不明白错误 #2。看起来是一个int和一个boolean相加的问题,但是如果是这样的话,为什么之前那行没有编译错误呢,这正是同一行代码减去“”的位置和(c<8)。我之前见过 boolean 字符串的编译没有错误,例如
(5 < 3) + "ok" = "falseok"
这是否意味着 boolean 值的串联只能通过 Stringchain 完成,而不能通过其他原语完成?那为什么第二行可以编译呢?
我不明白错误#3。编译器说:“不兼容的类型:从 int 到 char 可能有损转换”。为什么 char 不隐式转换为 int?我们在类里面了解到,如果在与 和 it 相同的等式中,byte、short 和 char 类型可以自动转换为 int,那么为什么这里不会发生这种情况呢?
我不明白错误#4。编译器说:“不兼容的类型:java.lang.String无法转换为 boolean 值”。与 #1 相同,为什么在这种情况下不接受 booleanString 连接?
非常感谢。
最佳答案
- #2 发生是因为
c<8
评估为boolean
无法添加到int
。该行没有编译错误 之前因为boolean
表达式转换为String
在连接之前。 请注意顺序很重要!而s = k + c + (c < 8) + ""
不是有效的表达式,s = "" + k + c + (c < 8)
是一个。 - #3 出现是因为表达式
c + 1
计算结果为int
其存储大小大于char
,所以有 像这样转换:(char) (c + 1)
. - #4 发生是因为您无法分配
String
表达式为boolean
变量
看看 +
operator 的规范了解实际发生的情况以及narrowing primitive conversion部分了解为什么需要 Actor 阵容。
不要担心从一开始就无法理解一切:我们都是从那里开始的。随着时间的推移,Java 积累了一些特性。您能做的最好的事情(恕我直言)就是学习阅读规范。
关于java - 不理解Java中的一些基本编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58551420/