为什么不能编译这个简单的scala示例?

时间:2011-03-04 05:16:42

标签: scala

class X extends Map[String, String] {
    def x(): X = { X() } // can't be compiled
}

无法编译,错误是:

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

为什么找不到X?我看不出如何纠正它。


更新:

我现在知道原因。我想要做的是创建一个扩展HashMap的类,因为Map()将返回HashMap的实例,所以我想我可以扩展Map。现在,正确的代码应该是:

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

3 个答案:

答案 0 :(得分:13)

我可以建议你尝试不同的方法吗?

扩展集合库是您可以在Scala中执行的更高级的操作之一。要正确完成工作,您需要深入了解更高级的类型,推理,方差,含义和CanBuildFrom机制。这不是一个初学者可以采取的轻松任务。

另一方面,你实际上需要扩展一个集合是非常罕见的。

回到第一原则......你认为正确的方法是扩展HashMap,你试图解决什么问题?我几乎可以保证在Scala中有更好的方法。

更新Mk.II

此答案以前包含对集合框架CanBuildFrom逻辑的描述。根据@ soc的建议,我现在已将该部分答案迁移到FAQ question here

答案 1 :(得分:4)

尝试new X()代替X() - 你会收到另一个错误,但它会让你走上正确的道路我相信。

在后一种情况下,它试图在X表示的表达式上调用apply(例如,假设X被定义为object X或{{ 1}})和试图调用 class X的构造函数。

快乐的编码。

答案 2 :(得分:1)

目前还不清楚你要做什么,但它没有编译的原因是没有名为'X'的字段,函数或方法,并且没有带'apply()的模块'X' '方法。

“如何纠正?”

澄清你想要达到的目标。