我是scala的新手。 Here是我試圖寫的Models.scala。 當我運行SBT包是給錯誤做網絡時斯卡拉case class.type不參數
Models.scala:25: models.Session.Network.type does not take parameters
[error] network : Network = Network() ,
我不明白爲什麼這個錯誤發生時,我沒有傳遞任何參數()。有人能幫我嗎
我是scala的新手。 Here是我試圖寫的Models.scala。 當我運行SBT包是給錯誤做網絡時斯卡拉case class.type不參數
Models.scala:25: models.Session.Network.type does not take parameters
[error] network : Network = Network() ,
我不明白爲什麼這個錯誤發生時,我沒有傳遞任何參數()。有人能幫我嗎
看起來你可能有一些導入覆蓋正在進行。你有代碼中的導入Sessions._ someplace嗎?注意你的錯誤引用了Session.Network,這是你的隱式BSonDocument類。您可能正在嘗試構建簡單案例類。
嘗試使用網絡明確:網絡:models.Network = models.Network()
這裏是一個小的代碼,重現您的問題:
case class A(b:B = B(3, 5))
case class B(i: Int, j: Int)
object A {
val B = "whatever"
}
在第一行,我們得到
too many arguments for method apply: (index: Int)Char in class StringOps
會發生什麼情況是,當您定義案例類的簽名時,您既定義了構造函數的簽名(當您使用new調用時),也定義了伴侶對象(當你沒有新的電話時)。
將參數中的默認值(代碼中的Network()和B中的(3,5))放在默認值中時,此代碼將在構造函數和應用方法的上下文中編譯伴侶對象。
由於您已經定義了伴隨對象Session,所以apply方法會自動添加到此對象中。恰好你的伴侶對象中的Network()意味着你在那裏定義的Network對象上的Network.apply(),它意味着我的代碼中值爲「whatever」的字符串B.
然後真正奇怪的是,默認表達式可能具有不同的含義,但在構造函數和apply方法的上下文中都是正確的。在這種情況下,您可能會得到不同的行爲,具體取決於您是否使用新呼叫進行呼叫。
下面是一個例子:
case class A(b:B = bb)
case class B(i: Int, j: Int)
object bb extends B(3, 4)
object A {
val bb = new B(7, 2)
}
object Test extends App {
println(A())
println(new A())
}
運行試驗將打印
A(B(7,2))
A(B(3,4))
針對您的特殊問題,有簡單的解決方法。
network: Network = models.Network(),
會的工作,很明顯,因爲它是那麼清楚,你想在網絡包,而不是在對象會話。
network: Network = new Network(),
也可以工作,因爲使用新的編譯器會尋找網絡類型而不是網絡值。在伴隨對象會話中,網絡值由本地聲明進行映射,但網絡類型不是。
IMO,前者(models.Network)更清晰。
PS。我檢查了規範,我相信這種奇怪的行爲是符合它的。也就是說,(5.3.2)一個apply方法在伴隨對象內部具有與構造方法相同的參數列表。這包括默認值,然後將在伴隨對象內進行編譯。
我不知道這是否符合規範和意圖(因爲其他行爲太複雜,無法指定或實施)|根據規範,但一個疏忽|違反規範。 我會檢查規範,如果它仍然不清楚,請在郵件列表 – 2014-11-05 23:23:58
我相信現在這符合規範。不過,我通知郵件列表。 – 2014-11-06 00:46:08