2016-09-16 25 views
0

在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位服務器甲骨文公司的虛擬機

+0

總的來說,我發現的IntelliJ偶爾與Scala編譯器不同意,無論在什麼應該編譯,什麼不應該。 IIRC Scala插件重新實現了編譯器的某些部分,而不是使用實際的編譯器。 – badcook

+0

它是'var',而不是'val',請參閱https://github.com/scala/scala/blob/v2.11.8/src/library/scala/collection/immutable/List.scala#L439。 –

+0

@AlexeyRamanov感謝您的源代碼鏈接。這是正確的,在源代碼中,它被聲明爲var。即使SerialVersionUID與github上的源代碼相同,在IntelliJ中看到不同的代碼也非常有趣 –

回答

1

你可以顯示代碼片段,你聲稱tl是一個val嗎?從列表來源,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 
} 
+0

我編輯了我的問題以添加代碼片段 –