[英]How to avoid implicit type conversion when pass varargs in Scala?
我写了这样的函数:
def a (params:Any*) = {
val clazzes = params.map(_.getClass)
...
}
但是,当我传入Scala Long类型的参数时,它会自动转换为java.lang.Long
有什么方法可以避免这种情况?
您可以禁止在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)
您可能希望编写避免装箱的通用代码。 如果是这样,您需要研究专业化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.