我写了一个这样的函数:
def a (params:Any*) = {
val clazzes = params.map(_.getClass)
...
}
但是当我传入一个Scala Long类型的param时,它会自动转换为java.lang.Long
有没有办法避免这种情况?
答案 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)
你可能希望编写避免装箱的通用代码。如果是这样的话,你需要考虑专业化。