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

Fre*_*ind 0 scala

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

无法编译,错误是:

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

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


更新:

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

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

Kev*_*ght 13

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

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

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

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

更新Mk.II

这个答案以前包含了对集合框架CanBuildFrom逻辑的描述.根据@ soc的建议,我现在已将这部分答案迁移到常见问题解答中

  • @soc - 更好的是,我将收集所有关于堆栈溢出的答案并将它们放在一本书中:) (2认同)