2014-11-05 43 views
5

我是scala的新手。 Here是我試圖寫的Models.scala。 當我運行SBT包是給錯誤做網絡時斯卡拉case class.type不參數

Models.scala:25: models.Session.Network.type does not take parameters 
[error]   network : Network = Network() , 

我不明白爲什麼這個錯誤發生時,我沒有傳遞任何參數()。有人能幫我嗎

回答

0

看起來你可能有一些導入覆蓋正在進行。你有代碼中的導入Sessions._ someplace嗎?注意你的錯誤引用了Session.Network,這是你的隱式BSonDocument類。您可能正在嘗試構建簡單案例類。

嘗試使用網絡明確:網絡:models.Network = models.Network()

2

這裏是一個小的代碼,重現您的問題:

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方法在伴隨對象內部具有與構造方法相同的參數列表。這包括默認值,然後將在伴隨對象內進行編譯。

+0

我不知道這是否符合規範和意圖(因爲其他行爲太複雜,無法指定或實施)|根據規範,但一個疏忽|違反規範。 我會檢查規範,如果它仍然不清楚,請在郵件列表 – 2014-11-05 23:23:58

+0

我相信現在這符合規範。不過,我通知郵件列表。 – 2014-11-06 00:46:08