在Scala中导入特定的方法签名

时间:2013-02-16 04:08:34

标签: scala importerror ambiguous

是否有导入特定方法签名的方式?

def test() {
  lazy val log = LoggerFactory.getLogger("AndroidProxy")
  import log.{error, debug, info, trace}

  trace("This is a test")
  trace "This is also"   // <- This line will not compile 
}

也许这是不可能的,但我的主要目标是在不添加新方法的情况下允许此操作。我试过这些无济于事

import log.{error => error(_:String)}
import log.{error(x: String) => error(x)}

我认为主要挑战是所有方法都采用一个参数。我可以在没有()的情况下调用无参数方法,并且我可以创建一个方法调用链,它们省略了。 foo getX toString,但我不知道如何自动创建arity-1呼叫

这是this question的后续内容。

2 个答案:

答案 0 :(得分:3)

不,没有办法导入特定的方法签名。

答案 1 :(得分:3)

代码问题:

trace "This is also"   // <- This line will not compile 

您以某种方式导入了过多的trace重载变体 - 这就是您不能以这种方式使用Scala的中缀表示法。表达式如下:

e op

被解释为“Post fi x Operation”(参见Scala Language Specification的第6.12.2节),相当于电话:

e.op

所以你的代码将等同于:

trace."This is also"

这当然是编译错误。

如果您改为使用e1 op e2形式的“In fi x Operation”(Scala Language Specification的第6.12.3节),那么即使方法过载也没有任何问题:

scala> class Logger { def trace(s: String) = "1arg"; def trace(i: Int, s: String) = "2arg" }
defined class Logger

scala> val log = new Logger
log: Logger = Logger@63ecceb3

scala> log trace "This is also"
res0: String = 1arg