我正在尝试使用Scala的java jcommander库.java JCommander类有多个构造函数:
public JCommander(Object object)
public JCommander(Object object, ResourceBundle bundle, String... args)
public JCommander(Object object, String... args)
Run Code Online (Sandbox Code Playgroud)
我想调用第一个不带 varargs的构造函数.我试过了:
jCommander = new JCommander(cmdLineArgs)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error: ambiguous reference to overloaded definition,
both constructor JCommander in class JCommander of type (x$1: Any,x$2: <repeated...>[java.lang.String])com.beust.jcommander.JCommander
and constructor JCommander in class JCommander of type (x$1: Any)com.beust.jcommander.JCommander
match argument types (com.lasic.CommandLineArgs) and expected result type com.beust.jcommander.JCommander
jCommander = new JCommander(cmdLineArgs)
Run Code Online (Sandbox Code Playgroud)
我也尝试使用命名参数,但结果相同:
jCommander = new JCommander(`object` = cmdLineArgs)
Run Code Online (Sandbox Code Playgroud)
我怎么告诉Scala我想调用不带varargs的构造函数?
我正在使用Scala 2.8.0.
给定以下具有重载版本的伴随对象apply
:
object List {
def apply[T](): List[T] = new Nil
def apply[T](x1: T): List[T] = new Cons(x1, new Nil)
def apply[T](x1: T, x2: T): List[T] = new Cons(x1, new Cons(x2, new Nil))
def apply[T](elems: T*): List[T] =
elems.foldRight(List[T])((elem, l) => new Cons(elem, l))
}
Run Code Online (Sandbox Code Playgroud)
和两个实例
List(1) // Error - Ambiguity
List('a', 'b') // Works fine
Run Code Online (Sandbox Code Playgroud)
scalac抱怨第一个实例化(对重载定义的模糊引用),因为单个参数和varargs方法都是同样具体的.
搜索stackoverflow我发现可以强制使用单个参数方法.List[Int](1)
将使编译器使用def apply[T](x1: T)
.
我的问题是为什么第二个实例化def apply[T](x1: T, x2: T)
没有额外的"提示" 匹配?换句话说,为什么两个参数方法比单个参数方法不是的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")
}
Run Code Online (Sandbox Code Playgroud)
错误:对重载定义的模糊引用,两个方法然后返回特征类型
java.lang.Object,java.lang.Object*)org.mockito.stubbing.OngoingStubbing [java.lang.Object]和方法返回特征OngoingStubbing的特征OngoingStubbing type(java.lang.Object)org.mockito.stubbing.OngoingStubbing [java.lang.Object]匹配参数类型(java.lang.String)when(t.get()).thenReturn("a")