Scala-IDE - 具有不同签名的对象`apply`方法混合在一起?

时间:2012-06-14 10:23:01

标签: scala scala-ide

代码:

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方法 - 类型1只返回伴随类构造函数返回的内容,而类型-2不返回任何内容,而只是使用新实例执行某些操作。因此,他们有两组不同的论据。但是,我在 second type-2 apply方法中得到了错误(请参阅帖子的底部),其中_Link_标有下划线:

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

第一个type-2 apply方法做了一些工作,而在第二个(和3rd和4th ...)type-2应用方法我只想引用第一个,而不是复制那里写的内容。但是,Scala-IDE不允许我这样做,除非注释掉所有类型1的apply方法。看起来Scala-IDE在签名中迷失了,看不出我明显的意图。或者我做错了什么?

错误:第二个apply方法显示错误,内容为:

  

重载方法值适用于替代方案:(来源:   org.app.Page,目标:   org.app.Page,f :()=>单位,ISEXCLUSIVE:   Boolean)org.app.meta.Link<和大于(名称:字符串,目标:   org.app.Page,f :()=>单位,ISEXCLUSIVE:   Boolean)org.app.meta.Link无法应用于   (org.app.Page,   org.app.Page,()=> Unit.type,Boolean)

更新

请注意,第一个类型2的调用类型1应用方法没有问题。

2 个答案:

答案 0 :(得分:4)

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

如果这是一个已知问题,请检查Scala issue tracker(并在需要时打开票证)。

<强>更新

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

答案 1 :(得分:2)

这不是错误,请详细检查错误消息(下面的有趣部分是粗体字),您将看到最后一个apply方法实际上传递了错误类型签名的函数() => Unit.type而不是简单{ {1}}。

  

重载方法值适用于替代方案:(来源:org.app.Page,target:org.app.Page,f :()=&gt; Unit,isExclusive:Boolean)org.app.meta.Link&lt;和大于(name:String,target:org.app.Page,f :()=&gt; Unit,isExclusive:Boolean)org.app.meta.Link不能应用于(org.app.Page,org.app.Page, ()=&gt; Unit.type ,布尔值)

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

要解决您遇到的错误,只需在上次申请方法中将() => Unit替换为() => Unit

它应该是这样的:

() => ()