相关疑难解决方法(0)

如何在使用vararg和不使用vararg的方法之间消除Scala中的歧义

我正在尝试使用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.

java scala scalac

24
推荐指数
3
解决办法
7109
查看次数

对重载定义的模糊引用 - 一对二参数

给定以下具有重载版本的伴随对象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方法更 …

scala overloading variadic-functions

16
推荐指数
1
解决办法
1万
查看次数

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")  
}
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")

scala compiler-errors

10
推荐指数
3
解决办法
3835
查看次数