Scala:过度定义的模糊参考 - 最好消除歧义?

时间:2011-10-11 05:05:34

标签: scala overloading ambiguity

我有一个问题的后续问题,即带有和不带参数的重载方法定义的存在会导致编译错误,这已在下面讨论过:Why is this reference ambiguous?

回顾一下:

 trait A { 
    def foo( s: String ) : String
    def foo : String = foo( "foo" )
 }
 object B extends A {
    def foo( s: String ) : String = s
 } 
 B.foo     // won't compile

导致错误消息:

 error: ambiguous reference to overloaded function
 both method foo in object B of type(s: String)String
 and method foo in trait A of type => String
 match expected type Unit
 B.foo

一个有效的解决方案是为编译器提供期望的类型,如下所示:

 val s: String = B.foo

不幸的是,人们可能并不总是想要引入额外的变量(例如在断言中)。在上面引用的早期文章的答案中至少推荐两次的解决方案之一是使用空括号调用方法,如下所示:

 B.foo()

不幸的是,这会导致类似的编译器错误(Scala 2.9.0.1):

 (s: String)String <and>
 => String
 cannot be applied to ()
 B.foo()

这是一个错误,还是建议的错误解决方案? 最终:有什么选择可以简洁地做到这一点,如:

 assert( B.foo == "whatever" )

而不是

 val expected : String = B.foo
 assert( expected == "whatever" )

感谢。

2 个答案:

答案 0 :(得分:6)

assert( (B.foo: String) == "whatever" )

答案 1 :(得分:2)

您可以在第二个foo定义中添加空括号:

trait A { 
  def foo( s: String ) : String
  def foo() : String
}

然后您可以删除消除歧义,如其他地方所述:

assert( B.foo() == "whatever" )