加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala 2.7.7编译器/解释器中的虚假模糊引用错误?

发布时间:2020-12-16 09:25:54 所属栏目:安全 来源:网络整理
导读:谁能解释下面的编译错误?有趣的是,如果我将get()方法的返回类型更改为String,则代码编译得很好.请注意,thenReturn方法有两个重载:一元方法和一个至少需要一个参数的varargs方法.在我看来,如果调用在这里是模棱两可的,那么它总是模棱两可的. 更重要的是,有
谁能解释下面的编译错误?有趣的是,如果我将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")  
}

error: ambiguous reference to overloaded definition,
both method thenReturn in trait OngoingStubbing of type
java.lang.Object,java.lang.Object*)org.mockito.stubbing.OngoingStubbing[java.lang.Object]
and method thenReturn in trait OngoingStubbing of type
(java.lang.Object)org.mockito.stubbing.OngoingStubbing[java.lang.Object]
match argument types (java.lang.String)
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
}

if you call f("foo"),both A and B
are applicable. Which one is more
specific?

  • it is possible to call B with parameters of type (AnyRef),so A is
    as specific as B.
  • it is possible to call A with parameters of type (AnyRef,
    Seq[AnyRef])
    thanks to tuple
    conversion,Tuple2[AnyRef,
    Seq[AnyRef]]
    conforms to AnyRef. So
    B is as specific as A. Since both are
    as specific as the other,the
    reference to f is ambiguous.

关于“元组转换”的事情,它是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的版本都不是更具体,因为传递给一个的任何参数也可以传递给另一个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读