2011-03-04 99 views
0
class X extends Map[String, String] { 
    def x(): X = { X() } // can't be compiled 
} 

不能編譯,錯誤的是:爲什麼不能編譯這個簡單的scala示例?

<console>:6: error: not found: value X 
def x(): X = { X() } // can't be compiled 

爲什麼X沒有發現?我看不出如何糾正它。


UPDATE:

我現在知道原因。我想要做的是創建一個延伸HashMap的類,因爲Map()將返回HashMap的實例,所以我認爲我可以擴展Map。現在,正確的代碼應該是:

import scala.collection.immutable.HashMap 
class X extends HashMap[String, String] { 
    def x(): X = { new X() } 
} 
+0

Kevin Wright對收集的延伸有非常好的回答。考慮創建另一個SO問題,僅僅關注那個(擴展/創建Scala 2.8集合)特別是「解除」它的問題。 – 2011-03-04 18:47:21

+0

@pst,很好的建議,但現在,我太陌生了,我甚至不知道如何提出這個問題。 – Freewind 2011-03-06 07:47:02

回答

4

嘗試new X()而不是X() - 你會得到另一個錯誤,但它會爲您在正確的軌道,我相信上。

在它試圖調用在所述表達通過X表示應用後者的情況下(例如,想象其中X被定義爲object Xval X)和嘗試調用的構造 X.

快樂編碼。

+0

謝謝。你能告訴我如何正確地做到這一點?我是scala新手,剛剛嘗試了很多。 – Freewind 2011-03-04 05:36:11

1

目前還不清楚你想要做什麼,但是它沒有編譯的原因是沒有字段,函數或方法被稱爲'X',並且沒有模塊'X'和'apply( )' 方法。

「如何糾正它?」

澄清你想達到的目標。

+0

好的,我已經更新了這個問題,謝謝 – Freewind 2011-03-04 06:03:15

13

我可以推薦你嘗試不同的方法嗎?

擴展收集庫是您在Scala中可以做的更高級的事情之一。要正確地完成這項工作,您需要深入瞭解更高級別的類型,推理,變異,暗示和CanBuildFrom機制。這不是一個初學者要做的輕鬆任務。

另一方面,實際上需要擴展一個集合是非常罕見的。

回到第一個原則......你想解決什麼問題,你認爲正確的做法是擴大HashMap?我幾乎可以保證在Scala中有更好的方法來完成它。

UPDATE MKII的

這個答案以前包含在集合框架CanBuildFrom邏輯的描述。根據@ soc的建議,我現在已經將答案的那部分遷移到了FAQ question here

+0

感謝您的好意。我發現很難使用擴展HashMap來與其他類一起工作的類,所以我放棄了。我太新手了,我不能再多問你了。讓我花更多時間學習Scala。再次感謝。 – Freewind 2011-03-04 07:49:06

+0

非常好。考慮發佈這個'常見問題' - 它被埋在這篇文章中。 – 2011-03-04 21:27:38

+2

@soc - 更好的是,我只是收集我所有的堆棧溢出的答案,並把它們放在一本書中:) – 2011-03-04 21:46:43

相關問題