2

编码:

object Link {

  //TYPE-1 (purely functional)
  def apply(name: String, target: Page, f: () => Unit, isExclusive: Boolean) = new Link(name, target, f, isExclusive)
  //..

  //TYPE-2 (purely side-effect)
  def apply(source: Page, target: Page, f: () => Unit, isExclusive: Boolean): Link = {
    val link = Link("LINK [" + source.getName + "]->[" + target.getName + "]", target, f, isExclusive)
    source += link
    link
  }

  //type-2 too
  def apply(source: Page, target: Page, isExclusive: Boolean): Link = Link (source, target, () => Unit, isExclusive)

}

解释:有两种类型的apply方法 - type-1 仅返回伴随类构造函数返回的内容,而 type-2 不返回任何内容,而只是对新实例执行某些操作。因此,他们有两组不同的论据。但是,我在用下划线标记的第二种类型 2 应用方法上收到错误(见帖子底部) :_Link_

  def apply(source: Page, target: Page, isExclusive: Boolean): Link = _Link_ (source, target, () => Unit, isExclusive)

第一个类型 2 应用方法做了一些工作,在第二个(以及第三和第四个......)类型 2 应用方法中,我只想引用第一个,而不是复制那里写的内容。但是,除非所有类型 1 的应用方法都被注释掉,否则Scala-IDE 不允许我这样做。似乎 Scala-IDE 在签名中迷失了方向,看不到我明显的意图。还是我做错了什么?

错误:第二种apply方法显示错误,内容如下:

重载方法值适用于替代方案:(来源:org.app.Page,目标:org.app.Page,f:()=> Unit,isExclusive:Boolean)org.app.meta.Link <和>(名称:字符串,target: org.app.Page,f: () => Unit,isExclusive: Boolean)org.app.meta.Link 不能应用于 (org.app.Page, org.app.Page, () => Unit .type,布尔值)

更新

请注意,从第一个 type-2 调用 type-1 apply 方法时没有问题。

4

2 回答 2

4

这看起来像是 Scala 编译器中的一个错误(可以使用 scalac 2.9.2 在 Eclipse 之外重现该错误)。

如果这是一个已知问题,请检查Scala 问题跟踪器(如果需要,请打开票证)。

更新

正如 Harald Meland here所解释的,这不是编译器中的错误。

于 2012-06-14T11:28:11.413 回答
2

这不是bug,仔细检查错误信息(有趣的部分是下面的黑体字),你会看到最后一个apply方法实际上传递了一个错误类型签名的函数,() => Unit.type而不是简单() => Unit的。

重载方法值适用于替代方案:(来源:org.app.Page,目标:org.app.Page,f:()=> Unit,isExclusive:Boolean)org.app.meta.Link <和>(名称:字符串,target: org.app.Page,f: () => Unit,isExclusive: Boolean)org.app.meta.Link 不能应用于 (org.app.Page, org.app.Page, () => Unit .type , 布尔值)

原因是只有一个 Unit 类型的值,即(),但是,在您的情况下,当您调用() => Unit最后一个 apply 方法时,您将返回 Unit 类型的伴随对象而不是它的值。

要修复您遇到的错误,只需在您的最后一个应用方法中替换() => Unit为。() => ()

然后它应该看起来像这样:

def apply(source: Page, target: Page, isExclusive: Boolean): Link = Link (source, target, () => (), isExclusive)
于 2012-06-15T11:03:23.183 回答