在Scala版本2.11.8中,當我在Intellij中查看其源代碼時,List類已重新分配爲val錯誤。immutable.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顯示了分配相同的錯誤tx =「test2」。所以,即使存在對val錯誤的重新分配,也會使源代碼起作用。
的IntelliJ的版本是: 的IntelliJ IDEA 2016年2月3日 構建#IU-162.1812.17,建於2016年8月30日 JRE:1.8.0_40-B26 AMD64 JVM:Java的熱點(TM)64位服務器甲骨文公司的虛擬機
總的來說,我發現的IntelliJ偶爾與Scala編譯器不同意,無論在什麼應該編譯,什麼不應該。 IIRC Scala插件重新實現了編譯器的某些部分,而不是使用實際的編譯器。 – badcook
它是'var',而不是'val',請參閱https://github.com/scala/scala/blob/v2.11.8/src/library/scala/collection/immutable/List.scala#L439。 –
@AlexeyRamanov感謝您的源代碼鏈接。這是正確的,在源代碼中,它被聲明爲var。即使SerialVersionUID與github上的源代碼相同,在IntelliJ中看到不同的代碼也非常有趣 –