2010-01-02 173 views
1

我有一個簡單的問題給你:) 我有下面的Scala代碼,編譯並給出錯誤。 其實我期待代碼不被編譯,因爲它有一個抽象類型CT。而且這個錯誤更令人困惑,因爲scala說它找不到類型CT。斯卡拉抽象類型問題

class Currency { type ct=Currency } 
val c = new Currency 
println(c.ct) 

error: value ct is not a member of Currency

我感謝您的意見,

感謝, -A

PS - 使用涼亭2.7.7

+0

有趣的是,如果我嘗試 class Currency {type ct}; val c =新貨幣;代碼編譯,爲什麼?我想我不應該創建具體的貨幣實例,只要它具有抽象值即可。 – 2010-01-02 12:56:16

回答

14

仔細查看錯誤消息:「value ct不是貨幣的成員」。這裏的「價值」很重要。貨幣具有類型成員ct,但不是值成員ct。所以c.ct是一種類型,而不是表達式。

+3

Downvoted as unhelpful。 「成員」一詞的使用太多。另外,添加一些無關的示例代碼來證明您的格式化功能。 – 2010-01-02 19:21:20

3

在這種情況下類型CT是不是一個抽象的類型,但貨幣類型的簡單類型別名。因此該表達式應該編譯。

關於println表達式,您使用c.ct作爲要打印的值(通過調用它的toString)。這是不正確的,因爲c.ct不是一個值,而是一個類型(路徑相關類型)。因此,涉及c.ct的有效(但有些無意義的)表達式可能是:

val a: c.ct = new Currency 

希望有所幫助。

+0

我對這個問題添加了一條評論。 – 2010-01-02 12:57:01

+0

關於評論:那麼,即使我遇到過,並認爲這是一個錯誤。但它似乎存在一些原因: http://lampsvn.epfl.ch/trac/scala/ticket/1753 – 2010-01-02 13:41:11