作业是这里的关键。 请看下面REPL会话:
[email protected] ~ $ scala
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val x:Char = 'a'
x: Char = a
scala> x + 1
res0: Int = 98
scala> var y:Char = 'a'
y: Char = a
scala> y + 1
res1: Int = 98
scala> y = y + 1
<console>:8: error: type mismatch;
found : Int
required: Char
y = y + 1
^
scala>
因此,大家可以看到,除非你试图重新分配变量值一切顺利。当你写'a'+1
或x + 1
它被转换为Int
。 因此,当您最后尝试x = x + 1
重新分配时,则您正在尝试将Int
值分配给Char
变量。这解释了为什么会出现编译错误。
在Char
伴侣对象中有implicit def char2int(x: Char): Int
方法。 我认为在var x:Char = 'a' + 1
发生的第一件事就是调用此方法将'a'转换为97.然后将97加1,均为Int
s。然后,变量x
以与在val y:Char = 98
中相同的方式得到实例化。我认为这解释了变量初始化如何工作。
这不回答为什么'变种X:字符= A + 1'作品,但'X = X + 1 '不。在第一次赋值时,“a + 1”隐式转换为“Char”,但在重新分配时它不会。为什么? –
我编辑了我的答案。如果这与我认为的不同,请投票给我的答案删除,因为那意味着我不了解底层的东西。 –
也让我们区分“第一作业”和“初始化”,因为我认为这很重要。变量初始化与值初始化没有区别。我的意思是'val x:Char ='a'+ 1'与这个问题的'var x:Char ='a'+ 1'相同。 –