在Scala版本2.11.8中,当我在Intellij中查看源代码时,List类已重新分配给val错误。
例如,在List.map函数源代码中的第278行:
t.tl = nx
IntelliJ显示该行的分析错误,指出已重新分配给val。当我检查源代码时,'t'是一个变量,但'tl'是一个构造函数参数,它被声明为Val。以下是IntelliJ将我引导至tl:
声明的代码片段package scala.collection.immutable
@scala.SerialVersionUID(value = 509929039250432923)
final case class ::[B](override val head : B, private[scala] val tl : scala.collection.immutable.List[B]) extends scala.collection.immutable.List[B] with scala.Product with scala.Serializable {
override def tail : scala.collection.immutable.List[B] = { /* compiled code */ }
override def isEmpty : scala.Boolean = { /* compiled code */ }
}
我认为代码的一部分如下例所示:
class Test(val x: String)
var t: Test = new Test("test")
t.x = "test2"
同样,IntelliJ在赋值t.x =“test2”时显示相同的错误。那么,即使重新分配val错误,源代码的工作原理也是如此。
IntelliJ版本是: IntelliJ IDEA 2016.2.3 Build#IU-162.1812.17,建于2016年8月30日 JRE:1.8.0_40-b26 amd64 JVM:Oracle Corporation的Java HotSpot(TM)64位服务器VM
答案 0 :(得分:1)
您能否显示声明tl是val的代码段?从List源中,tl是var而不是val
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}