在
Scala中,如果我有变量声明,例如
var x: Char = 'a'
如果我然后尝试通过添加1来更新此字符,例如
x = x + 1
我收到编译错误:输入不匹配,找到Int必需的Char.但是,我可以在没有编译错误的情况下执行此操作:
x = 'a' + 1
我猜这与文字值和对象有关,但是,我试图弄清楚确切的行为.您可以清楚地为字符分配一个字面整数,例如97,你也可以分配97-32的结果.但是,如果我说97-32 5然后我得到一个类型不匹配错误.编译器在什么时候区分导致文字的表达式与导致对象的表达式?
解决方法
作业是关键.
查看以下REPL会话:
查看以下REPL会话:
alex@POSITRON ~ $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伴侣对象中有隐式def char2int(x:Char):Int方法.我认为在var x:Char =’a’1中,首先发生的是调用此方法将’a’转换为97.然后将97添加为1,两者都作为Ints.然后变量x以与val y中相同的方式实例化:Char = 98.我想解释变量初始化是如何工作的.