给定一个具有两个方法的Java类(取自mockito):

OngoingStubbing<T> thenReturn(T value);

OngoingStubbing<T> thenReturn(T value, T... values);


如果我从scala调用

....thenReturn("something")


我收到一个错误:

Description Resource    Path    Location    Type
ambiguous reference to overloaded definition, both method thenReturn in trait OngoingStubbing of type (x$1: java.lang.Object, x$2: <repeated...>[java.lang.Object])org.mockito.stubbing.OngoingStubbing[java.lang.Object] and  method thenReturn in trait OngoingStubbing of type (x$1: java.lang.Object)org.mockito.stubbing.OngoingStubbing[java.lang.Object] match argument types (java.lang.String)


而且我不知道如何解决此问题。

最佳答案

这些答案都是针对错误的问题。差异是细微的,但这与linked ticket中的问题不同。那确实需要不合理的体操来调用non-varargs方法。对于这个,以下内容就足够了。

thenReturn[String]("something")


或者,如果由于某种原因不想这样做,则不需要类型别名和强制类型转换。您可以直接使用结构类型归属。

(this: { def thenReturn[T](s: T): OngoingStubbing[T] }).thenReturn("something")


这里的问题是重载和多态相交处的类型推断-一种方法更具体,但是scalac不能确定哪种方法。由于重载和元组转换之间的相互作用,SI-2991中的问题是真正的歧义-两者都不是更具体。

关于scala - 在scala varargs中强制单个参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13358705/

10-16 06:25