Scala 2.7.7编译器/解释器中的虚假模糊引用错误?
谁能解释下面的编译错误?有趣的是,如果我将get()方法的返回类型更改为String,则代码编译得很好.请注意,thenReturn方法有两个重载:一元方法和一个至少需要一个参数的varargs方法.在我看来,如果调用在这里是模棱两可的,那么它总是模棱两可的.
更重要的是,有没有办法解决歧义? import org.scalatest.mock.MockitoSugar import org.mockito.Mockito._ trait Thing { def get(): java.lang.Object } new MockitoSugar { val t = mock[Thing] when(t.get()).thenReturn("a") }
解决方法
嗯,这是模棱两可的.我认为Java语义允许它,它可能值得一张要求在Scala中应用Java语义的票证.
ambiguitity的来源是这样的:一个vararg参数可以接收任意数量的参数,包括0.所以,当你写thenReturn(“a”)时,你的意思是调用thenReturn接收一个参数,或者你的意思是调用接收一个对象和一个vararg的thenReturn,将0个参数传递给vararg? 现在,发生了类似的事情,Scala试图找出哪种方法“更具体”.任何对细节感兴趣的人都应该在Scala的规范中查找,但这里是对这种特殊情况下发生的事情的解释: object t { def f(x: AnyRef) = 1 // A def f(x: AnyRef,xs: AnyRef*) = 2 // B }
关于“元组转换”的事情,它是Scala最模糊的语法糖之一.如果你打电话给f(a,b),其中a和b有A和B类型,并且没有f接受(A,B)但是有一个f接受(Tuple2(A,B)),那么参数(a,b)将转换为元组. 例如: scala> def f(t: Tuple2[Int,Int]) = t._1 + t._2 f: (t: (Int,Int))Int scala> f(1,2) res0: Int = 3 现在,当调用returnReturn(“a”)时,没有进行元组转换.那不是问题.问题在于,鉴于可以进行元组转换,thenReturn的版本都不是更具体,因为传递给一个的任何参数也可以传递给另一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |