2010-01-02 175 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