给定一个具有两个方法的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/