在Scala中传递varargs时如何避免隐式类型转换?

时间:2014-08-15 16:21:33

标签: java scala type-conversion variadic-functions

我写了一个这样的函数:

def a (params:Any*) = {
    val clazzes = params.map(_.getClass)
    ...
}

但是当我传入一个Scala Long类型的param时,它会自动转换为java.lang.Long 有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:0)

您可以取消Predef:

中定义的默认隐式转换
import Predef.{long2Long=>_,println}

object Test{

  val tL : java.lang.Long = 1L

}

然后您会收到类型错误:

Error:(26, 29) type mismatch;
 found   : scala.Long(1L)
 required: java.lang.Long
  val tL : java.lang.Long = 1L
                        ^

但是,在您的情况下,您的参数将被装箱为Any *(包装数组)。 scala long的运行时装箱表示是java.lang.Long。这不是隐式转换,因此不会被抑制。

import Predef.{long2Long=>_,println}

object Test extends App{

   def a(params: Any*) = {
    for(p<-params) yield(p.getClass)
  }

  println(a(1L))

}

输出:

ArrayBuffer(class java.lang.Long)

你可能希望编写避免装箱的通用代码。如果是这样的话,你需要考虑专业化。