代码:
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应用方法没有问题。
答案 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
。
它应该是这样的:
() => ()