【问题标题】:Why can't this simple scala example be compiled?为什么不能编译这个简单的 scala 示例?
【发布时间】:2011-07-08 13:55:26
【问题描述】:
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() }
}

【问题讨论】:

  • Kevin Wright 在收藏扩展方面有一个非常 好的回复。考虑创建另一个 SO 问题,只关注那个(扩展/创建 Scala 2.8 集合),特别是“un-bury”它的问题。
  • @pst,很好的建议,但是现在,我对 scala 太陌生了,我什至不知道如何问这个问题。

标签: scala


【解决方案1】:

尝试new X() 而不是X() - 你会得到另一个错误,但我相信它会让你走上正确的轨道。

在后一种情况下,它试图在X 表示的表达式 上调用apply(例如,想象X 被定义为object Xval X)和没有试图调用 class X 的构造函数。

编码愉快。

【讨论】:

  • 谢谢。你能告诉我如何正确地做吗?我是 scala 的新手,刚刚尝试了很多。
【解决方案2】:

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

“如何纠正?”

澄清你想要达到的目标。

【讨论】:

    【解决方案3】:

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

    扩展集合库是您在 Scala 中可以做的更高级的事情之一。要正确完成这项工作,您需要深入了解更高种类的类型、推理、方差、隐式和CanBuildFrom 机制。这不是一个初学者可以轻松完成的任务。

    另一方面,您实际上需要扩展集合的情况非常罕见。

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

    更新 Mk.II

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

    【讨论】:

    • 感谢您的善意建议。我发现很难使用扩展 HashMap 的类与其他类一起工作,所以我放弃了。我太新手了,不能多问你。让我花更多的时间来学习 scala。再次感谢。
    • 非常好。考虑将其作为“常见问题解答”发布——它被埋在这篇文章中。
    • @soc - 更好的是,我将收集所有关于堆栈溢出的答案并将它们放入书中:)
    • 很好的答案,但在风格上的挑剔:在一段中你说“暂时忽略 XxxLike 特征,该层次结构中的每一层都会增加一点功能”,然后在下一段中描述 TraversableLike 是如何实现的地图。听起来您首先是在说 xxxLike 特征中没有重要功能,但随后直接与该陈述相矛盾。那就是说……做得很好,先生! ;~)
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2017-11-25
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多